HDU 2845 Beans (两次线性dp)

Beans

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3521    Accepted Submission(s): 1681

Problem Description

Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled with different qualities beans. Meantime, there is only one bean in any 1*1 grid. Now you want to eat the beans and collect
the qualities, but everyone must obey by the following rules: if you eat the bean at the coordinate(x, y), you can’t eat the beans anyway at the coordinates listed (if exiting): (x, y-1), (x, y+1), and the both rows whose abscissas are x-1 and x+1.

Now, how much qualities can you eat and then get ?

Input

There are a few cases. In each case, there are two integer M (row number) and N (column number). The next M lines each contain N integers, representing the qualities of the beans. We can make sure that
the quality of bean isn‘t beyond 1000, and 1<=M*N<=200000.

Output

For each case, you just output the MAX qualities you can eat and then get.

Sample Input

4 6
11 0 7 5 13 9
78 4 81 6 22 4
1 40 9 34 16 10
11 22 0 33 39 6

Sample Output

242

Source

2009 Multi-University Training Contest 4 -
Host by HDU

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2845

题目大意:在一个矩阵中选择一些数,要求和最大,如果选择(x,y)位置的数,则(x, y+1),(x,y-1)位置不可选,第x+1和第x-1行都不可选

题目分析:题目给了m*n的范围,就是不让你开二维开开心心切掉,不过不影响,一维照样做,先对于每一行dp一下,求出当前行能取得的最大值

tmp[j] = max(tmp[j - 1],a[i + j - 1] + tmp[j - 2])第一个表示不选第i行第j列得数字,第二个表示选,取最大,则最后tmp[m]为当前行最大的

然后因为相邻两行不能同时取,我再对行做一次dp

dp[i] = max(dp[i - 1], dp[i - 2] + row[i]),第一个表示不选第i行,第二个表示选第i行,取最大,则最后dp[cnt - 1]即为答案

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 2 * 1e5 + 5;
int row[MAX], a[MAX], dp[MAX], tmp[MAX];

int main()
{
    int n, m;
    while(scanf("%d %d", &n, &m) != EOF)
    {
        memset(tmp, 0, sizeof(tmp));
        memset(dp, 0, sizeof(dp));
        for(int i = 1; i <= m * n; i++)
            scanf("%d", &a[i]);
        int cnt = 1;
        for(int i = 1; i <= m * n; i += m)
        {
            for(int j = 2; j <= m; j++)
            {
                tmp[1] = a[i];
                tmp[j] = max(tmp[j - 1], a[i + j - 1] + tmp[j - 2]);
            }
            row[cnt ++] = tmp[m];
        }
        dp[1] = row[1];
        for(int i = 2; i < cnt; i++)
            dp[i] = max(dp[i - 1], dp[i - 2] + row[i]);
        printf("%d\n", dp[cnt - 1]);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 19:11:34

HDU 2845 Beans (两次线性dp)的相关文章

HDU 2845 Beans(DP,最大不连续和)

题意    吃豆子游戏    当你吃了一个格子的豆子   该格子左右两个和上下两行就不能吃了    输入每个格子的豆子数    求你最多能吃多少颗豆子 可以先求出每行你最多可以吃多少颗豆子   然后每行就压缩成只有一个格子了   里面的豆子数就是那一行最多可以吃的豆子数   然后问题就变成求一列最多可以吃多少颗豆子了   和处理每一行一样处理   那么问题就简化成求一行数字的最大不连续和问题了 令d[i]表示某一行前i个豆子的最大和  有两种情况  吃第i个格子中的豆子和不吃第i个格子中的豆子

HDU 2845 Beans (DP)

Problem Description Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled with different qualities beans. Meantime, there is only one bean in any 1*1 grid. Now you want to eat the beans and collect the qualities, but everyo

HDU 2845 Beans (最大不连续子序列和)

Beans Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2637    Accepted Submission(s): 1302 Problem Description Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled wi

HDU 2845 Beans (动规)

Beans Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2596    Accepted Submission(s): 1279 Problem Description Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled w

HDU 2845 Beans (DP)

Beans Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2845 Description Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled with different qualities beans. Meantime,

hdu 2845——Beans——————【dp】

Beans Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3418    Accepted Submission(s): 1629 Problem Description Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled wi

hdu 2845 Beans(DP)

题意: M*N的矩阵,每个格子上有一个值. 规则:如果你拾起了某个格子(i,j)上的值,那么第i-1行.第i+1行.(i,j-1)格子上.(i,j+1)格子上的值都不能取. 问最多可以取得多少值(最大值). 思路: 如果某行取了某一个值,则它的前一行和后一行都不能取.所以我们必须知道这行可以取得的最大值是多少. dp[i]=max( dp[i-1],dp[i-2]+a[i] ) dp[i]:前i个数能获得的最大值.第i个可以取,可以不取. 当每行的dp[N]都算出来后,可以发现从行的角度看,dp

HDU - 2845 Beans

http://acm.hdu.edu.cn/showproblem.php?pid=2845 审题 取一个点 那么相邻行的点和 这一行和它左右相连的点就不能再取了 涉及取舍的问题 整体无法考虑 只能从局部出发-->>动态规划 可惜没看出来 ----要进行状态压缩 就是很标准的dp了 1.先多每一行进dp求得每一行可以得到的最大值 2.在取对n行进行dp得到最终的最大值 所以两类其实方式都是一样的 以求每一行最大值为例 culumn[MAXN]; 定义dp[i] : 前i列(含)可以取 得的最大

HDU 2845(dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2845 Beans Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3097    Accepted Submission(s): 1495 Problem Description Bean-eating is an interesting g