[题目链接]

          ​​https://www.lydsy.com/JudgeOnline/problem.php?id=1109​

[算法]

          DP

[代码]

          



#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010

struct info
{
int x,y;
} b[MAXN];

int i,n,m,cnt,pos;
int a[MAXN],q[MAXN];

inline bool cmp(info a,info b)
{
return a.x == b.x ? a.y < b.y : a.x < b.x;
}

int main()
{

scanf("%d",&n);
for (i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
if (i - a[i] < 0) continue;
b[++m].x = i - a[i];
b[m].y = a[i];
}
sort(b+1,b+m+1,cmp);
for (i = 1; i <= m; i++)
{
if (i == 1 || b[i].y > q[cnt]) q[++cnt] = b[i].y;
else
{
pos = lower_bound(q+1,q+cnt+1,b[i].y) - q;
q[pos] = b[i].y;
}
}

printf("%d\n",cnt);

return 0;

}