HDU 2845 Beans

来源:互联网 发布:防蓝光护眼软件 编辑:程序博客网 时间:2024/05/21 06:18

题目分析

这道题很明显就是求最大的序列,但是选择的时候有要求,对于同一行来说,选取了一列,则相邻列的都不能选择,对于不同行,选取了这一行那么相邻行不能选,这样结果已经很明显了,做2次dp就可以了。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 200005;int a[maxn],b[maxn],dp[maxn];int main(){    int M,N,i,j,k;    while(scanf("%d%d", &M, &N) != EOF){        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        memset(dp,0,sizeof(dp));        for(i = 1; i <= M; i++)        {            for(j = 1; j <= N; j++)                scanf("%d", &a[j]);            dp[1] = a[1];            for(j = 2; j <= N; j++)                dp[j] = max(dp[j-1], dp[j-2]+a[j]);            b[i] = dp[N];        }        memset(dp,0,sizeof(dp));        dp[1] = a[1];        for(i = 1; i <= M; i++)            dp[i] = max(dp[i-1], dp[i-2] + b[i]);        printf("%d\n", dp[M]);    }    return 0;}
0 0
原创粉丝点击