51nod 1051

一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。

 
例如:3*3的矩阵:
 
-1 3 -1
2 -1 3
-3 1 2
 
和最大的子矩阵是:
 
3 -1
-1 3
1 2

Input第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。
第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 <= Mii <= 10^9)Output输出和的最大值。如果所有数都是负数,就输出0。Sample Input

3 3
-1 3 -1
2 -1 3
-3 1 2

Sample Output

7

矩阵数据处理的时候,存储每列前i个元素的和,后面就暴力……在矩阵内部圈四边形的感觉……记录每个矩形内的最大和……emmmmm……不太会描述

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,m,a,ans,sum;
int dp[505][505];
int main()
{
    scanf("%d%d", &m,&n);
    memset(dp, 0, sizeof(dp));
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            scanf("%d", &a);
            dp[i][j] = dp[i - 1][j] + a;
        }
    for (int i = 0; i < n; i++)
        for (int j = i; j < n; j++)
        {
            sum = 0;
            for (int k = 0; k < m; k++)
            {
                sum += dp[j][k] - dp[i-1][k];
                if (sum < 0) sum = 0;
                ans = max(sum, ans);
            }
        }
    printf("%d
", ans);
    return 0;
}
原文地址:https://www.cnblogs.com/Egoist-/p/7413431.html