Beans (HDU2845)(最大不连续子列和)

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

解析

首先题目要求如果拿了(x,y)这个位置的数字,那么(x,y-1),(x,y+1)都不能再拿了。

如果拿了x行的那么x+1行和x-1行也不能再拿了。

我们先分析一行,dp[i]表示当前的最大和,那么dp[i] = max(dp[i - 1], dp[i - 2] + a[i]);

要么取这个位置要么不取这个位置,取两者的最优解。

如果我们求出每一行的最优解,再来按行来看的话还是这个问题,因此两次dp即可。

AC代码

#include <bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 5;
int n, m;
int mp[maxn], dp[maxn], b[maxn];

int main()
{
    while(scanf("%d%d", &n, &m) != EOF)
    {
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= m; j++)
                scanf("%d", &mp[j]);

            for(int j = 1; j <= m; j++)
            {
                if(j == 1)
                    dp[j] = mp[j];
                else if(j == 2)
                    dp[j] = max(mp[j], dp[j - 1]);
                else
                    dp[j] = max(dp[j - 1], dp[j - 2] + mp[j]);
            }
            b[i] = dp[m];
        }

        for(int i = 1; i <= n; i++)
        {
            if(i == 1)
                dp[i] = b[i];
            else if(i == 2)
                dp[i] = max(b[i], dp[i - 1]);
            else
                dp[i] = max(dp[i - 1], dp[i - 2] + b[i]);
        }
        printf("%d\n", dp[n]);
    }
    return 0;
}
发布了76 篇原创文章 · 获赞 18 · 访问量 2756

猜你喜欢

转载自blog.csdn.net/qq_43446165/article/details/103815724
今日推荐