DP起手练习4(NOI导刊)

题目描述

数列(线性DP好题)

虽然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.

思路

DP的码量很小,但个人认为思维难度仅次于数论,而这个DP基础题我都是费了很大劲才A了,还看了题解.
本题很容易想到用二维状态 f [ i ] [ j ] {f[i][j]} f[i][j]来表示前 i {i} i个数中删除 j {j} j个后的符合条件数的个数的最大值.那么根据题意我们到第 i {i} i个数时有两种选择:
第一种:不选直接删,则有DP转移方程: f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] {f[i][j]=f[i-1][j-1]} f[i][j]=f[i1][j1];
第二种:选择加入这个数,那么又有两种情况:
若( a [ i ] = i − j {a[i]=i-j} a[i]=ij(即为符合要求的数))则有 f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j − 1 ] , f [ i − 1 ] [ j ] + 1 ) {f[i][j]=max(f[i-1][j-1],f[i-1][j]+1)} f[i][j]=max(f[i1][j1],f[i1][j]+1),
否则: f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j − 1 ] , f [ i − 1 ] [ j ] ) {f[i][j]=max(f[i-1][j-1],f[i-1][j])} f[i][j]=max(f[i1][j1],f[i1][j])
最后在循环中添加 a n s {ans} ans统计最大值即可.

代码

#include<bits/stdc++.h>
#define N 1005
using namespace std;

int n,ans=-1;
int a[N],f[N][N];


int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)//预处理,避免在两重循环中特判f[i-1][j-1]
	{
		if(a[i]==i)f[i][0]=f[i-1][0]+1;
		else f[i][0]=f[i-1][0];
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=i;j++)//这里我简化了一点点
		{
			if(a[i]==i-j)f[i][j]=max(f[i-1][j-1],f[i-1][j]+1);
			else f[i][j]=max(f[i-1][j-1],f[i-1][j]);
			ans=max(f[i][j],ans);
		}
	printf("%d\n",ans);
	return 0;				
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
NOI导刊培训2018是一次为参与全国信息学奥林匹克竞赛(NOI)的学生们举办的培训活动。NOI导刊是一本专门为NOI学生出版的期刊,目的是为他们提供高质量的培训资料和信息学竞赛的最新动态。在2018年的培训活动中,学生们将有机会学习和应用基本的算法和数据结构,并通过参加模拟比赛来提高他们的比赛技巧。 培训活动将由经验丰富的导师和教师指导学生们进行讲解和实践。他们将以易于理解和实用的方式来介绍各种算法和数据结构的概念,并提供延伸的学习材料让学生们进行深入学习和练习。此外,学生们还将参与互动讨论和小组项目,以加深对所学知识的理解和应用。 培训活动还将包括模拟比赛,让学生们在真实的竞赛环境中练习和应用所学的算法和数据结构。导师和教师将为学生们提供反馈和建议,帮助他们发现和改进他们的错误和不足之处。这样的实践和反馈将有助于学生们在竞赛中更好地应对各种挑战,并提高他们在比赛中的成绩。 通过这次培训活动,学生们将能够提高他们的算法和编程技能,增加他们在信息学竞赛中的竞争力。他们还可以结识其他对信息学竞赛有兴趣的同学,共同学习和交流。NOI导刊培训2018将为学生们提供一个全面而深入的学习和训练机会,帮助他们在信息学竞赛中取得更好的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liaoxiyan123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值