题意:
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