【洛谷 1799】数列
题目描述
虽然msh长大了,但她还是很喜欢找点游戏自娱自乐。有一天,她在纸上写了一串数字:1,l,2,5,4。接着她擦掉了一个l,结果发现剩下l,2,4都在自己所在的位置上,即1在第1位,2在第2位,4在第4位。她希望擦掉某些数后,剩下的数列中在自己位置上的数尽量多。她发现这个游戏很好玩,于是开始乐此不疲地玩起来……不过她不能确定最多能有多少个数在自己的位置上,所以找到你,请你帮忙计算一下!
输入格式
第一行为一个数n,表示数列的长度。
接下来一行为n个用空格隔开的正整数,第i行表示数Ai。
输出格式
一行一个整数,表示擦掉某些数后,最后剩下的数列中最多能有多少个数在自己的位置上,即Ai=i最多能有多少。
输入输出样例
输入 #1
5 1 1 2 5 4
输出 #1
3
说明/提示
对于20%的数据,n≤20;
对于60%的数据,n≤100;
对于100%的数据,n≤l000。
题解:emm和最长公共子序列好像哦。。。
f [ i ][ j ]表示的就是前i个字符,保留j个最多能有多少个处在自己位置上
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<bits/stdc++.h> using namespace std; const int N=1003; int n,a[N],f[N][N],ans; int main(){ freopen("1799.in","r",stdin); freopen("1799.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++){ for(int j=i;j>=1;j--){ if(a[i]==j) f[i][j]=max(f[i-1][j],f[i-1][j-1]+1); else f[i][j]=max(f[i-1][j],f[i-1][j-1]); } } for(int i=1;i<=n;i++) ans=max(ans,f[n][i]); cout<<ans; return 0; }