poj 2385

来源:互联网 发布:nba1516数据库· 编辑:程序博客网 时间:2024/06/05 07:28
一共有 2 棵苹果树,
一头奶牛站在其中一棵苹果树下等待苹果落下,
由于任意一个时刻只能站在一棵树下,它从一棵树移动到另外一棵树的时间不计,

奶牛不愿意太频繁移动,现在给定苹果的下落次序和最大移动次数,问奶牛最多可以抓住几个苹果。

/*16ms,388KB*/#include<cstdio>#include<algorithm>using namespace std;int dp[31];///dp[i]表示进行了i次移动后接到(吃掉)的苹果数的最大值///偶数为第一棵树,奇数为第二棵树///所以开一个一维数组就行int main(){int i, n, w, tree;scanf("%d%d", &n, &w);while (n--){scanf("%d", &tree);if (tree == 1){for (i = 2; i <= w; i += 2)///第一棵树dp[i] = max(dp[i], dp[i - 1]) + 1;///要么不换位置,要么换位置++dp[0];///不进行任何移动时所能接到的苹果数}else{for (i = 1; i <= w; i += 2)///第二棵树dp[i] = max(dp[i], dp[i - 1]) + 1;}//for (i = 0; i <= w; ++i)//printf("%d\t", dp[i]);//putchar(10);//putchar(10);}printf("%d\n", max(dp[w - 1], dp[w]));return 0;}

给出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 35int 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;}


原创粉丝点击