题目:点击打开链接
题意:有两棵树,初始在1树,T秒每一秒都有果子从其中一棵树掉落,你只能在这两棵树之间走W次,求最多能接到多少果子
解法:dp[i][j][k]表示第i秒 走了j次 在k树,因为初始位置是1树,注意递推前首先要进行初始化dp[i][0][1]。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int t,w,a[1005],dp[1005][35][3],ans;
while(cin>>t>>w)
{
for(int i=1;i<=t;i++) cin>>a[i];
memset(dp,0,sizeof(dp)); //第i秒 j次 k树
for(int i=1;i<=t;i++)
{
if(a[i]==1) dp[i][0][1]=dp[i-1][0][1]+1;
else dp[i][0][1]=dp[i-1][0][1];
}
for(int i=1;i<=t;i++)
for(int j=1;j<=w;j++)
{
if(a[i]==1)
{
dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][2])+1;
dp[i][j][2]=max(dp[i-1][j][2],dp[i-1][j-1][1]);
}
if(a[i]==2)
{
dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][2]);
dp[i][j][2]=max(dp[i-1][j][2],dp[i-1][j-1][1])+1;
}
}
ans=max(dp[t][w][1],dp[t][w][2]);
cout<<ans<<endl;
}
return 0;
}