洛谷p2690

f[i][j]表示第i时刻移动了j次的最大答案

转移:
f[i][j]=max(f[i-1][j],f[i-1][j-1])+(a[i]==(j%2+1))
注意:一开始Bessie处在第一棵树

代码

#include<iostream>
#include<cstdio>

using namespace std;
int t,w;
int a[1005],f[1005][35];
int gap[1005];
int main()
{
	scanf("%d%d",&t,&w);
	a[0]=1;
	for(int i=1;i<=t;++i)
	{
		scanf("%d",&a[i]);
		gap[i]=gap[i-1]+(a[i]!=a[i-1]);
	}
	for(int i=1;i<=t;++i)
	{
		f[i][0]=f[i-1][0]+(a[i]==1);
		for(int j=1;j<=gap[i]&&j<=w;++j)
		{
			f[i][j]=max(f[i][j],f[i-1][j]+(a[i]==(j%2+1)));
			f[i][j]=max(f[i][j],f[i-1][j-1]+(a[i]==(j%2+1)));
		}
	}
	int ans=0;
	for(int i=0;i<=w;++i)
	{
		ans=max(ans,f[t][i]);
	}
	printf("%d\n",ans);
	return 0;
}
发布了25 篇原创文章 · 获赞 1 · 访问量 328

猜你喜欢

转载自blog.csdn.net/qq_43665203/article/details/104130360
今日推荐