1077. [NOIP2010冲刺六] 数列游戏

时间:2022-09-17 19:41:20

【题目描述】

小M很喜欢找点游戏自娱自乐。有一天,她在纸上写了一串数字:1,1,2,5,4。接着她擦掉了一个1,结果发现剩下1,2,4都在自己所在的位置上,即1在第1位,2在第2位,4在第4位。她希望擦掉某些数后,剩下的数列中在自己位置上的数尽量多。她发现这个游戏很好玩,于是开始乐此不疲地玩起来……不过她不能确定最多能有多少个数在自己的位置上,所以找到你,请你帮忙计算一下!

【输入格式】

第一行为一个数n,表示数列的长度。

接下来一行为n个用空格隔开的正整数,第i行表示数Ai。

【输出格式】

一行一个整数,表示擦掉某些数后,最后剩下的数列中最多能有多少个数在自己的位置上,即Ai=i最多能有多少。

【样例输入】

5

1 1 2 5 4

【样例输出】

3

【提示】

对于20%的数据,n≤20;

对于60%的数据,n≤100;

对于100%的数据,n≤l000

 #include<iostream>
#include<cstdio> using namespace std; int main()
{
freopen("seqgame.in","r",stdin);
freopen("seqgame.out","w",stdout);
int ac[]={};
int dp[]={};
int n;int max;
cin>>n;
int i,j;
for(i=;i<=n;i++)
cin>>ac[i];
for(i=;i<=n;i++)
{
if(ac[i]>i)
{
dp[i]=;
continue;
}
max=;
for(j=;j<i;j++)
if(ac[i]>ac[j])
if((ac[i]-ac[j])<=(i-j))
{
if(dp[j]>max)max=dp[j];
}
dp[i]=max+;
}
max=;
for(i=;i<=n;i++)
if(dp[i]>max)max=dp[i];
cout<<max<<endl;
return ;
}

代码分析:

其实该题就是求最长递增子序列;只不过是加了一些附加的条件;

首先,应该是该元素的值应该大于等于该元素的下标;否则不行,即赋值为0;

其次,元素之差要小于等于下标之差;

在上边这些条件下找出DP数组中第i个元素前的最大值加1赋给dp[i];

最后在dp数组中寻找最大值然后输出;