http://acm.hdu.edu.cn/showproblem.php?pid=1081
题意:给一个n*n的矩阵,求其子矩阵的最大和。
思路:转化为一维求最大子段和。dp[i][j][k]表示从i到j行k列的最大值、
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; int a[110][110],sum[110][110][110],dp[110][110][110]; int main() { int n; while(~scanf("%d",&n)) { for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) scanf("%d",&a[i][j]); memset(sum,0,sizeof(sum)); for(int g = 1; g <= n; g++) { for(int i = 1; i <= n; i++) { sum[i][i][g] = a[i][g]; for(int j = i+1; j <= n; j++)//求i到j行第g列的和 sum[i][j][g] = sum[i][j-1][g] + a[j][g]; } } memset(dp,0,sizeof(dp)); int ans = -INF; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { for(int g = 1; g <= n; g++) { if(dp[i][j][g-1] < 0) dp[i][j][g] = sum[i][j][g]; else dp[i][j][g] = dp[i][j][g-1] + sum[i][j][g]; ans = max(ans,dp[i][j][g]); } } } printf("%d\n",ans); } return 0; }
hdu 1081 To The Max(子矩阵最大和),布布扣,bubuko.com
原文:http://blog.csdn.net/u013081425/article/details/19965441