题目:题目的意思是说总共有两棵树,每分钟从A树上或者B树上掉下来一个苹果,首先Bessie站在A树下,他可以跑到另外一棵树下去解苹果,但是移动次数不超过w,问掉落下t个苹果,在移动次数不超过w的情况下,他能最多接到多少个苹果。
方法:开始时觉得很像数塔,但是想了半天也没什么思路。后来借鉴了一下别人的思路。设置dp[i][j][k](i代表掉落的第i苹果,j代表移动次数,k代表当前站在A树还是B树下)。
假设当前掉落了第i个苹果,移动次数为j,
若当前站在A树下,则dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j-1][1])+(f[i]==1);
若当前站在B树下,则dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][0])+(f[i]==2);
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int t,w;
int mas=-1,f[1010],dp[1010][35][2];
while(cin>>t>>w)
{
memset(dp,0,sizeof(dp));
mas=-1;
for(int i=1;i<=t;i++)
cin>>f[i];
for(int i=1;i<=t;i++)
{
dp[i][0][0]=dp[i-1][0][0]+(f[i]==1);
dp[i][0][1]=dp[i-1][0][1]+(f[i]==2);
mas=max(mas,max(dp[i][0][1],dp[i][0][0]));
for(int j=1;j<=i&&j<=w;j++)
{
dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j-1][1])+(f[i]==1);
dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][0])+(f[i]==2);
mas=max(mas,max(dp[i][j][1],dp[i][j][0]));
}
}
cout<<mas<<endl;
}
return 0;
}