#include <iostream>
using namespace std;
//题意:求出矩阵中不连续子数列的最大和,
//规则:取[x,y],则[x, y-1],[x, y+1],x+1行,x-1行都不能取
//[x, y-1],[x, y+1]表示本行是不连续的
//x+1行,x-1行表示本列是不连续的。
//思路:
//1、首先求出每一行的最大值,保存到数组row[]中,
//2、然后再把row[]当成以行,再求一次最大不连续值
#define NSIZ 200020
//arr[i]保存原数值
int arr[NSIZ];
//dp[i][0]表示不取第i个数不连续的最大值,dp[i][1]表示取第i个数时最大值
int dp[NSIZ][2];
//row[i]表示当第i行中最大不连续值
int row[NSIZ];
int main()
{
int i, j,k;
int n, m;
while(scanf("%d %d", &m, &n) != EOF)
{
dp[0][0] = 0;
dp[0][1] = 0;
for(i = 1;i <= m; ++i)
{
for(j = 1; j <= n; ++j)
{
scanf("%d", &arr[j]);
dp[j][0] = max(dp[j-1][0] ,dp[j -1][1]);
dp[j][1] = dp[j-1][0] + arr[j];
}
//求m次横的最大不连续值
row[i] = max(dp[n][0], dp[n][1]);
}
//求一次竖的最大不连续值
dp[0][0] = 0;
dp[0][1] = 0;
for(j = 1; j <= m; ++j)
{
dp[j][0] = max(dp[j-1][0] ,dp[j - 1][1]);
dp[j][1] = dp[j-1][0] + row[j];
}
printf("%d\n", max(dp[m][0], dp[m][1]));
}
return 0;
}
hdu2845Beans[动态规划]
最新推荐文章于 2018-11-18 18:39:19 发布