这题属于最大不连续字段和。
因为它是二维的所以把第i行做一次线性dp,压成dp[i]来储存,再在dp数组中做一次最大不连续字段和求答案就好啦,一道二维的题目,秒变一维的。
状态表示:dp[i]代表第i行在做最大不连续字段和的最终值。
转移方程:当i大于2——如果dp[i]从它的前一位转移而来那么它的值便是dp[i-1],如果dp[i]从第i-2位转移而来它的值便是dp[i-2]+dp[i],在二者中取最大值(满足最优子结构):dp[i]=max(dp[i-1],dp[i-2]+dp[i]);
#include<bits/stdc++.h>
using namespace std;
const int N=200000+5;
int n,m,a[N],dp[N];
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
scanf("%d",&a[j]);
for(int j=2;j<=m;j++)
a[j]=max(a[j-2]+a[j],a[j-1]);
dp[i]=a[m];
}
for(int i=2;i<=n;i++)
dp[i]=max(dp[i-2]+dp[i],dp[i-1]);
printf("%d\n",dp[n]);
}
return 0;
}
知识兔