题目分析
这道题很明显就是求最大的序列,但是选择的时候有要求,对于同一行来说,选取了一列,则相邻列的都不能选择,对于不同行,选取了这一行那么相邻行不能选,这样结果已经很明显了,做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;
}