可以设计三维DP,dp[i][j][k]表示i秒的时候,走了j步,在编号为k的树下获得的最大价值。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int T,W; int dp[1200][40][3]; int a[2000]; int ans; void read() { for(int i=1;i<=T;i++) scanf("%d",&a[i]); } void init() { memset(a,-1,sizeof a); memset(dp,-1,sizeof dp); ans=0; } void work() { if(a[1]==1) dp[1][0][1]=1,dp[1][1][2]=0,ans=1; else dp[1][0][1]=0,dp[1][1][2]=1,ans=1; for(int i=1;i<=T;i++) { for(int j=0;j<=W;j++) { ans=max(ans,dp[i][j][1]); ans=max(ans,dp[i][j][2]); if(dp[i][j][1]!=-1) { //原地不动 if(a[i+1]==1) dp[i+1][j][1]=max(dp[i+1][j][1],dp[i][j][1]+1); else dp[i+1][j][1]=max(dp[i+1][j][1],dp[i][j][1]); //移动到2 if(a[i+1]==2) dp[i+1][j+1][2]=max(dp[i+1][j+1][2],dp[i][j][1]+1); else dp[i+1][j+1][2]=max(dp[i+1][j+1][2],dp[i][j][1]); } if(dp[i][j][2]!=-1) { //原地不动 if(a[i+1]==2) dp[i+1][j][2]=max(dp[i+1][j][2],dp[i][j][2]+1); else dp[i+1][j][2]=max(dp[i+1][j][2],dp[i][j][2]); //移动到1 if(a[i+1]==1) dp[i+1][j+1][1]=max(dp[i+1][j+1][1],dp[i][j][2]+1); else dp[i+1][j+1][1]=max(dp[i+1][j+1][1],dp[i][j][2]); } } } printf("%d ",ans); } int main() { while(~scanf("%d%d",&T,&W)) { init(); read(); work(); } return 0; }