题目大意:
给一个N*N大小的矩阵,每个格子上有一个数字。 求这个矩阵中的子矩阵上面数字之和最小的数字是多少。
给一个N*N大小的矩阵,每个格子上有一个数字。 求这个矩阵中的子矩阵上面数字之和最小的数字是多少。
解析:将二维矩阵转换为一维,再用最大子段和的思想求解,和上题的思想差不多。
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 105;
const int INF = 0x3f3f3f3f;
int grid[N][N],tot[N][N];
int sum[N];
int n;
int maxSub() {
int dp,max;
dp = max = sum[0];
for(int i = 1; i < n; i++) {
if(dp > 0) {
dp += sum[i];
}else {
dp = sum[i];
}
if(max < dp) {
max = dp;
}
}
return max;
}
int main() {
while(scanf("%d",&n) != EOF) {
memset(grid,0,sizeof(grid));
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
scanf("%d",&grid[i][j]);
if(i == 0) {
tot[i][j] = grid[i][j];
}else {
tot[i][j] = tot[i-1][j] + grid[i][j];
}
}
}
int max = -INF;
for(int i = 0; i < n; i++) {
for(int j = i; j < n; j++) {
for(int k = 0; k < n; k++) {
if(i == 0) {
sum[k] = tot[j][k];
}else {
sum[k] = tot[j][k] - tot[i-1][k];
}
}
int ans = maxSub();
if(max < ans) {
max = ans;
}
}
}
printf("%d\n",max);
}
return 0;
}