描述
http://poj.org/problem?id=2385
两棵苹果树,给定一个时间t,1~t每分钟有一棵树掉苹果,牛起始在#1树,最多换w次位置,问最多接到多少苹果.
分析
用f[i][j][k]表示第i分钟,已经移动了j次,在#k树下的最优解.
注意:
1.有些时候动规写成+的形式比-的形式方便
1 #include<cstdio> 2 #include<algorithm> 3 using std :: max; 4 5 const int maxt=1005,maxw=35; 6 int t,w; 7 int tree[maxt],f[maxt][maxw][3]; 8 9 inline int move(int x) { return x== 1 ? 2: 1; } 10 11 void solve() 12 { 13 int ans=1; 14 for(int i=1;i<t;i++) 15 { 16 for(int j=0;j<=w;j++) 17 { 18 for(int k=1;k<=2;k++) 19 { 20 if(k==tree[i+1]) 21 { 22 f[i+1][j][k]=max(f[i+1][j][k],f[i][j][k]+1); 23 f[i+1][j+1][move(k)]=max(f[i+1][j+1][move(k)],f[i][j][k]); 24 } 25 else 26 { 27 f[i+1][j][k]=max(f[i+1][j][k],f[i][j][k]); 28 f[i+1][j+1][move(k)]=max(f[i+1][j+1][move(k)],f[i][j][k]+1); 29 } 30 } 31 } 32 } 33 for(int i=1;i<=t;i++) 34 { 35 for(int j=0;j<=w;j++) 36 { 37 for(int k=1;k<=2;k++) 38 { 39 ans=max(ans,f[i][j][k]); 40 } 41 } 42 } 43 printf("%d\n",ans); 44 } 45 46 47 void init() 48 { 49 scanf("%d%d",&t,&w); 50 for(int i=1;i<=t;i++) 51 { 52 scanf("%d",tree+i); 53 } 54 if(tree[1]==1) f[1][0][1]=1; 55 else f[1][1][2]=1; 56 } 57 58 int main() 59 { 60 #ifndef ONLINE_JUDGE 61 freopen("apple.in","r",stdin); 62 freopen("apple.out","w",stdout); 63 #endif 64 init(); 65 solve(); 66 #ifndef ONLINE_JUDGE 67 fclose(stdin); 68 fclose(stdout); 69 #endif 70 return 0; 71 } 72
时间: 2024-10-28 15:01:58