bzoj3384[Usaco2004 Nov]Apple Catching 接苹果*&&bzoj1750[Usaco2005 qua]Apple Catching*

bzoj3384[Usaco2004 Nov]Apple Catching 接苹果

bzoj1750[Usaco2005 qua]Apple Catching

题意:

两棵树,每分钟会从其中一棵树上掉一个苹果下来,捡苹果的人只愿意W次,问初始在树1处最多能捡多少苹果。分钟数≤1000,W≤30。

题解:

dp。f[i][j][0/1]表示第i分钟移动了j次现在在第2/1棵树下。具体看代码。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <queue>
 5 #define inc(i,j,k) for(int i=j;i<=k;i++)
 6 #define maxn 1010
 7 #define INF 0x3fffffff
 8 using namespace std;
 9 
10 inline int read(){
11     char ch=getchar(); int f=1,x=0;
12     while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
13     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
14     return f*x;
15 }
16 bool a[maxn]; int f[2][40][2],n,w,x,y,ans;
17 int main(){
18     n=read(); w=read(); inc(i,1,n)a[i]=read()&1; x=0; y=1;
19     inc(i,0,w)f[x][i][1]=0; inc(i,1,w)f[x][i][0]=0; f[x][0][0]=-INF;
20     inc(i,2,n+1){
21         if(!a[i-1])f[y][0][0]=f[x][0][0]+1,f[y][0][1]=f[x][0][1];
22         else f[y][0][0]=f[x][0][0],f[y][0][1]=f[x][0][1]+1;
23         inc(j,1,w){
24             if(!a[i-1])f[y][j][0]=max(f[x][j-1][1],f[x][j][0]+1),
25             f[y][j][1]=max(f[x][j-1][0]+1,f[x][j][1]);
26             else f[y][j][0]=max(f[x][j-1][1]+1,f[x][j][0]),
27             f[y][j][1]=max(f[x][j-1][0],f[x][j][1]+1);
28         }
29         swap(x,y);
30     }
31     inc(i,0,w)ans=max(ans,max(f[x][i][0],f[x][i][1])); printf("%d",ans); return 0;
32 }

 

20161017

posted @ 2016-10-20 14:30  YuanZiming  阅读(338)  评论(0编辑  收藏  举报