hdu2845Beans[动态规划]

来源:互联网 发布:python ddt使用 编辑:程序博客网 时间:2024/05/29 17:37
#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;}