poj2385_dp
题意:两颗苹果树每一分钟会有树落下苹果,有人去接,但是来回两个树之间的次数是一定的,所以求出在最大次数时最多能接到多少苹果。
分析:
设dp[i][j]表示在时间i内,已经来回了j次时得到的最大苹果数目。
初始化dp[1][0]=1 if(array[1]==1)
dp[1][1]=1;
状态转移方程:
dp[i][j]=dp[i-1][j]+array[i]%2 (j==0)
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+(array[i]==j%2+1)); (j<=i)
dp[i][j]=max(dp[i][j],dp[i-1][j]+(array[i]==j%2+1)); (j<=i)
代码:
View Code
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 //276K 0MS 6 //dp 7 int dp[1001][31]; 8 int array[1001]; 9 10 int main() 11 { 12 int t,w,i,j; 13 memset(dp,0,sizeof(dp)); 14 scanf("%d%d",&t,&w); 15 for(i=1;i<=t;i++) 16 scanf("%d",&array[i]); 17 if(array[1]==1) 18 dp[1][0]=1; 19 dp[1][1]=1; 20 for(i=2;i<=t;i++) 21 for(j=0;j<=w;j++) 22 { 23 if(j==0) 24 { 25 dp[i][j]=dp[i-1][j]+array[i]%2; 26 continue; 27 } 28 if(j<=i) 29 { 30 dp[i][j]=max(dp[i][j],dp[i-1][j-1]+(array[i]==j%2+1)); 31 dp[i][j]=max(dp[i][j],dp[i-1][j]+(array[i]==j%2+1)); 32 } 33 } 34 printf("%d\n",dp[t][w]); 35 return 0; 36 }