http://poj.org/problem?id=2385
app
題目大意:spa
有兩棵樹,一開始站在第一棵樹,每秒有蘋果從樹上掉下(不會同時兩棵樹都有),你最多移動w次,求t秒後你能獲得的最大的蘋果數目。code
思路:blog
設d[i][j]表示第i個蘋果移動j次能得到的最大蘋果數 。ip
則 dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]);get
若是當前的位置有蘋果則dp[i][j]++string
如何肯定當前位置?由於就在兩棵樹間移動,因此根據奇偶性便可。it
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN=1024; int dp[MAXN][35];//d[i][j]表示第i個蘋果移動j次能得到的最大蘋果數 int apple[MAXN],cur[MAXN]; int main() { cur[0]=1; for(int i=1;i<=30;i++) { if(i&1) cur[i]=2; else cur[i]=1; } int t,w; while(~scanf("%d%d",&t,&w)) { dp[0][0]=0; for(int i=1;i<=t;i++) { scanf("%d",&apple[i]); dp[i][0]=dp[i-1][0]+ (apple[i]==1?1:0); //一開始寫app[i]==cur[i]跪了。。。 應該是不動的時候能夠得到的,也能夠是cur[0] //固然cur[0]=1 } for(int i=1;i<=t;i++) { for(int j=1;j<=w;j++) { dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]); //若是當前蘋果i的位置apple[i]與如今所站的位置相同,能夠拿一個蘋果 if(cur[j]==apple[i]) dp[i][j]++; } } int ans=0; for(int i=0;i<=w;i++) ans=max(dp[t][i],ans); printf("%d\n",ans); } return 0; }