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