DP:Apple Catching(POJ 2385)

本文介绍了一个有趣的算法问题——牛如何在两棵树间移动以最大化吃到的苹果数量,并提供了一种使用动态规划解决该问题的方法。通过定义状态转移方程并利用二维矩阵存储中间结果,最终求得最优解。

            

                  牛如何吃苹果

  问题大意:一个叫Bessie的牛,可以吃苹果,然后有两棵树,树上苹果每分钟会掉一个,这只牛一分钟可以在两棵树中往返吃苹果(且不吃地上的),然后折返只能是有限次W,问你这只叫Bessie的牛最多可以吃到多少个苹果

  首先我们应该很容易想到,这个必须要用DP去做,然后就是考虑怎么储存旧值的问题了,因为树有两棵,然后每个往返状态对应不同的结果,所以我们应该用一个二维矩阵去储存(苹果的个数就不重要了,因为我们只用算到最后,前面的都可以扔掉)。

  然后状态方程应该怎么写呢?也很简单,定义一个状态为dp[i][j]表示在第i棵树的剩余多少次转移机会时的能吃到苹果的最大个数,而牛可以从旁边一棵树走过来也可以是本来就在这棵树旁边

  所以状态转移方程很自然的就是

    dp[i][j]=max(dp[i][j],dp[i-1][j+1])+1 (j<w && i+1>w-j)

    dp[i][j]=dp[i][j]+1;(j=w)

  同时还要注意有一些状态是没有意义的,典型就是i+1<w-j的时候(你想一下苹果掉落的分钟数都比牛跑过来的次数还要少,怎么可能嘛!)

  

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define MAX(a,b) (a)>(b)?(a):(b)
 4 
 5 static int Tree[2][31];
 6 
 7 int main(void)
 8 {
 9     int T, W, i, k, Which_Tree, ans = 0;
10     while (~scanf("%d%d", &T, &W))
11     {
12         for (i = 0; i < T; i++)
13         {
14             scanf("%d", &Which_Tree);
15             Tree[Which_Tree - 1][W]++;
16             for (k = W - 1; k >= 0 && i + 1 > W - k; k--)
17                 Tree[Which_Tree - 1][k] = 
18                     MAX(Tree[!(Which_Tree - 1)][k + 1] + 1, Tree[Which_Tree - 1][k] + 1);
19         }
20         for (i = 0; i < 2; i++)
21             for (k = 0; k <= W; k++)
22                 ans = MAX(Tree[i][k], ans);
23         printf("%d", ans);
24     }
25 
26     return 0;
27 }

 

转载于:https://www.cnblogs.com/Philip-Tell-Truth/p/4815021.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值