题意:
1、 对于每一行来说,相邻的数不可同时取;
2、同样对于列来说,相邻的行也不能同时取;
3、因此可得状态方程:dp[i]=dp[i-1]>(dp[i-2]+a[i])?dp[i-1]:dp[i-2]+a[i]。先对每一行运用,在对每一行求出的和作为一组运用,可得最终结果。
#include<iostream>
using namespace std;
int col[200001];
int dp[200001];
int GetMaxRow(int a[],int n)
{
dp[0]=0;
dp[1]=a[1];
for(int i=2;i<=n;i++)
dp[i]=dp[i-1]>(dp[i-2]+a[i])?dp[i-1]:dp[i-2]+a[i];
return dp[n];
}
int main()
{
int m,n,i,j;
int a[200001],sum;
while(scanf("%d%d",&m,&n)==2)
{
for(j=1;j<=m;j++)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
col[j]=GetMaxRow(a,n);
}
sum=GetMaxRow(col,m);
printf("%d\n",sum);
}
return 0;
}
原文地址:http://blog.csdn.net/a809146548/article/details/44261913