poj2385 dp(递推)
题目链接 :http://bak3.vjudge.net/contest/136499#problem/D
题意:
//转移方程dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]) //表示前i秒移动j步能接到的最多苹果数。 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int dp[1005][35]; int a[1005]; int main() { int T,W; while(scanf("%d%d",&T,&W)==2) { for(int i=1; i<=T; i++) scanf("%d",&a[i]); memset(dp,0,sizeof(dp)); int ans; //初始位置是第一颗树 if(a[1]==1) //如果给定的第一个位置是第一棵树 { dp[1][1]=0; //移动到第二个位置,接不到苹果 dp[1][0]=1;//不动,接到一颗苹果 } if(a[1]==2)//如果给定的第一个位置是第二棵树 { dp[1][1]=1;//移动到第二个位置,接到一颗苹果 dp[1][0]=0;//不动,接不到苹果 } for(int i=2; i<=T; i++) //从第二个位置开始循环 { for(int j=0; j<=W; j++) { if(j==0) //j=0 j-1就越界了 { if(a[i]==1) dp[i][j]=dp[i-1][j]+1; continue; } else { if((a[i]==1 && j%2==0)||(a[i]==2 && j%2==1)) ans=1; else ans=0; dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+ans; } } } int sum=dp[T][0]; for(int i=1; i<=W; i++) sum=max(sum,dp[T][i]); printf("%d\n",sum); } return 0; }