现在的位置: 首页 > 综合 > 正文

poj2385 – Apple Catching

2012年04月19日 ⁄ 综合 ⁄ 共 1048字 ⁄ 字号 评论关闭

                                
想看更多的解题报告:
http://blog.csdn.net/wangjian8006/article/details/7870410
                                 
转载请注明出处:
http://blog.csdn.net/wangjian8006

题目大意:有两个树,每分钟在某棵树的一颗会掉落一个苹果,奶牛可以在树下捡苹果,不过奶牛在两棵树之间的转移次数有限,所以问在t时刻,最大
转移次数为w,奶牛可以得到的最大苹果数,初始时奶牛在第一棵树

给出t与w
接着t行给出1,2分别代表那分钟是那棵树掉落了苹果

解题思路:每次奶牛只有两种决策,在某一分钟的时候转移或者不转移,我们只要知道前面分钟两者之间的最大值,继而可以得到当前状态的最大值
动态规划设dp[T][W]代表第T分钟的时候移动W次的所得到的最大苹果数
那么状态转移方程为:
dp[T][W] = max(dp[T-1][W] + (a[T]==W%2+1),dp[T-1][W-1]+(a[T]==W%2+1))
a[T]==W%2+1,是看当前转移了W次后在哪棵树下,当前能不能得到这个苹果

#include <stdio.h>
#include <string.h>
#define MAXT 1010
#define MAXW 35

int dp[MAXT][MAXW];
int a[MAXT];

int main(){
	int t,w,i,j;
	while(~scanf("%d%d",&t,&w)){
		dp[0][0] = 0;
		for(i = 1;i <= t;i++){
			scanf("%d",&a[i]);
			dp[i][0] = dp[i-1][0] + (a[i]==1);				//若不转移数为0,那么i时刻内得到的苹果是第一棵树掉落的苹果总数
		}
		for(i = 1;i<=w;i++)	dp[1][i] = 1;			//转移一次以上,那么第一分钟内的都可以得到1个苹果

		for(i = 2;i <= t;i++){
			for(j = 1;j <= w;j++){
				dp[i][j] = dp[i-1][j]+(a[i]==j%2+1);				//若在i分钟的时候转移到另一颗树上

				if(dp[i][j] < dp[i-1][j-1] + (a[i]==j%2+1)){		//若在i分钟的时候不转移到另一颗树上可以得到最大
					dp[i][j] = dp[i-1][j-1] + (a[i]==j%2+1);
				}
			}
		}
		printf("%d\n",dp[t][w]);
	}
	return 0;
}

 

抱歉!评论已关闭.