【t089】数列2
来源:互联网 发布:成都妇女儿童医院网络 编辑:程序博客网 时间:2024/06/08 14:32
Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
虽然msh长大了,但她还是很喜欢找点游戏自娱自乐。有一天,她在纸上写了一串数字:1,1,2,5,4。接着她擦掉了一个1,结
果发现剩下1,2,4都在自己所在的位置上,即1在第1位,2在第2位,4在第4位。她希望擦掉某些数后,剩下的数列中在自己的
位置上的数尽量多。她发现这个游戏很好玩,于是开始乐此不疲地玩起来……不过她不能确定最后能有多少个数在自己的位置
上,所以找到你,请你帮忙计算一下!
【数据规模】
对于20%的数据,n≤20;
对于60%的数据,n≤100;
对于100%的数据,n≤1000。
【输入格式】
第一行为一个数n ,表示数列的长度。 接下来一行为n个用空格隔开的正整数,第i行表示数Ai 。
【输出格式】
一行一个整数,表示擦掉某些数后,最后剩下的数列中最多能有多少个数在自己的位置上,即Ai=i最多能有多少。
Sample Input
5
1 1 2 5 4
Sample Output
3
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t089
【题解】
每个数只有删和不删两种结果;
设f[i][j]表示前i个数中删掉j个数之后,满足a[x]==x的x最多有多少个;
如果a[i]==i-j;
则f[i][j] = f[i-1][j]+1;
表示前i-1个数删掉了j个数字,然后第i个数不删掉;
那么a[i]==i了;所以加上1;
同时还有;
如果a[i]删掉;
则f[i][j] = max(f[i][j],f[i-1][j-1]);->前i-1个数删掉了j-1个,然后前i个数删掉了j个,那这个状态转移其实就是说删掉了第i个数;
如果a[i]不删掉;
则f[i][j]=max(f[i][j],f[i-1][j]);当然如果i-j==a[i]还要加1;
综上
if (a[i]==i-j) f[i][j] = f[i-1][j]+1;
f[i][j] = max(f[i][j],f[i-1][j],f[i-1][j-1]);
******************(不删、删)
【完整代码】
#include <cstdio>#include <algorithm>using namespace std;#define rei(x) scanf("%d",&x)#define rep1(i,x,y) for (int i = x;i <= y;i++)const int MAXN = 1e3+100;int n;int a[MAXN];int f[MAXN][MAXN];int main(){ //freopen("F:\\rush.txt","r",stdin); rei(n); rep1(i,1,n) rei(a[i]); rep1(i,1,n) rep1(j,0,i) { if (i-j==a[i]) f[i][j] = f[i-1][j] + 1; f[i][j] = max(f[i][j],f[i-1][j]); f[i][j] = max(f[i][j],f[i-1][j-1]); } int ma = f[n][0]; rep1(i,1,n) ma = max(ma,f[n][i]); printf("%d\n",ma); return 0;}
- 【t089】数列2
- 2-06. 数列求和
- (2)Fibonacci数列
- Fib数列问题2
- 【wikioi1732】Fibonacci数列 2
- 2-06. 数列求和
- 2-06. 数列求和
- 回文数列2
- 2-06. 数列求和
- 【u102】数列分段2
- 数列分段2
- Codevs1732 Fibonacci数列2
- 1041: 数列求和2
- 2,费式数列
- 数列
- 数列
- 数列
- 数列!!!
- SQL SERVER公用表表达式 (CTE)的用法和运用场景
- 动态数组使用
- Windows环境下使用cmd面板手动编译c/c++程序
- 字母索引表
- SPOJ Fata7y Ya Warda! 裸单调栈 1月25日
- 【t089】数列2
- 网络爬虫:淘女郎
- Til the Cows Come Home
- easyui tab 加载iframe 高度问题
- HDU1213并查集基础
- UVa401
- 清华大学 质因数的个数
- css IE6和W3C盒子定义区别
- Git可视化工具SourceTree的简单使用