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\n", ans); return 0; }