CQUOJ 2732 - Beans

 

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


/*
2016年5月19日00:40:23
题意:在图中取数,例如取了81之后,同一行的相邻两个不能取,
        还有81的上面那行和下面那行也不能取,问能取到的最大和是多少? 

    状态转移方程:sum[i] = max (sum[i-2]+sum[i], sum[i-1])
*/
# include <iostream>
# include <algorithm>
# include <cstdio>
# include <cstring>
# include <queue>
# include <vector>
# include <cmath>
# include <map>
# include <set>
# define pi acos(-1)
# define LL long long
# define INF 0x3f3f3f3f
using namespace std;
const int N = 2e5 + 5;

int a[N], b[N];
int dp[N];

int main(void)
{    
    int n, m, i, j;
    while(~scanf("%d %d", &n, &m)){
        dp[0] = 0;
        for (i = 1; i <= n; i++){
            for (j = 1; j <= m; j++)
                scanf("%d", &a[j]);
            dp[1] = a[1];
            for (j = 2; j <= m; j++)    
                dp[j] = max(dp[j-1], dp[j-2]+a[j]);
            b[i] = dp[m];
        }
        dp[1] = b[1];
        for (i = 2; i <= n; i++){
            dp[i] = max(dp[i-1], dp[i-2]+b[i]);
        }
        cout<<dp[n]<<endl;
    }    
    return 0;
}

 

posted @ 2016-05-19 00:43  昵称还没有想归一  阅读(73)  评论(0)    收藏  举报