//Memory 156K Time 0MS
#include <bits/stdc++.h>
using namespace std;
int arr[110][110] = {0};
int sumOfMaximalSubRectangle(int n) {
//录入方阵数据
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &arr[i][j]);
//最大子矩阵和
int maxNum = 0;
//暂时存储矩阵的i-j行的数据
vector<int> v(n, 0);
int j;
//两个指针控制行数
for (int i = 0; i < n; i++) {
j = i;
//构造数组
//逐个位置构造
for (; j < n; j++) {
for (int k = 0; k < n; k++)
v[k] += arr[j][k];
//计算当前数组的最大子序列和
//化二维为一维
int pre = v[0];//存储之前的计算结果,初始化为v[0],遍历从m=1开始
int cur;//存储当前计算的结果
for (int m = 1; m < v.size(); m++)
cur = max(v[m], v[m] + pre), pre = cur, maxNum = max(cur, maxNum);
}
//清空暂时储存i-j行的数据
//方便后续i和j的更新,然后存储新的数据
fill(v.begin(), v.end(), 0);
}
return maxNum;
};
int main() {
int n;//方阵大小
while (~scanf("%d", &n))
printf("%d\n", sumOfMaximalSubRectangle(n));
return 0;
}
poj1050题解
最新推荐文章于 2023-02-19 13:51:34 发布