分析
比较简单的DP题,横着竖着都求一遍不相邻的最大子段和就好了.
状态转移方程有多种写法
dp[i]=max(dp[i-1],dp[i-2]+a[i]) //dp[i]代表前i个能取得的最大值
或者
dp[i]=max(dp[i-2],dp[i-3]+a[i]) //dp[i]代表取前i个且取得第i个时的最大值
或者其他
代码
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int dp[210000];
int ddp[210000];
int main()
{
int m,n;
while (scanf("%d%d",&m,&n)!=EOF)
{
int k;
int ans=0;
for (int i=0;i<m;i++)
{
int Max=0;
for (int j=0;j<n;j++)
{
scanf("%d",&k);
if (j==0||j==1)
dp[j]=k;
else
dp[j]=max(dp[j-2],dp[j-3])+k;
if (dp[j]>Max)
Max=dp[j];
}
if (i==0||i==1)
ddp[i]=Max;
else
ddp[i]=max(ddp[i-2],ddp[i-3])+Max;
if (ddp[i]>ans)
ans=ddp[i];
}
printf("%d\n",ans);
}
return 0;
}