HDU 1081 To The Max - 最大字段和

传送门

题目大意:

求一个矩阵的最大子矩阵和。

题目分析:

刚开始考虑了一下dp方程的递推,但是不好转。简便的方法是预处理sum[i][j]表示第i行的前j个元素之和,之后\(n^3\)枚举子矩阵就可以了。

code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;

const int N = 105;
int n, sum[N][N], a[N][N], mx;
typedef pair<int, int> P;
P dp[N][N];

int main(){
    while(~scanf("%d", &n)){
        mx = -99999999; memset(sum, 0, sizeof sum);
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++){
                scanf("%d", &a[i][j]);
                sum[i][j] = sum[i][j - 1] + a[i][j];
            }
        // dp[1][1]
        for(int i = 1; i <= n; i++)
            for(int j = i; j <= n; j++){
               int s = 0;
               for(int k = 1; k <= n; k++){
               		if(s < 0) s = 0;
               		s += sum[k][j] - sum[k][i - 1];
               		if(s > mx) mx = s;
    		   }
            }
        printf("%d\n", mx);
    }
    return 0;
}
posted @ 2017-10-13 07:41  CzYoL  阅读(89)  评论(0编辑  收藏  举报