贪心
这道题比力扣最大子矩阵还难一点,关键在那个一维数组长度限制上,要做额外工作
复杂度有点高,有兴趣可以优化一下
#include <iostream>
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include <algorithm>
#include<cstdlib>
#include<vector>
int maxNum;
// 传入左右边界,传入一维数组
// 找到最大连续子序列和
void count(int* nums,int left,int right) {
// 当前和
int curSum = -1e9;
// 贪心算法
for (int k = left; k <= right; k++) {
// 如果当前和大于0,加当前数
if (curSum > 0) {
curSum += nums[k];
}
else {
// 如果当前和小于等于0,抛弃掉当前和
// 当前和赋值为当前数
curSum = nums[k];
}
// 如果当前和大于当前nums的最大值,并且左left右k边界相差<n
if (curSum > maxNum) {
// 如果当前最大值比答案max都要大
// 记录答案最大值
if (curSum > maxNum) {
maxNum = curSum;
}
}
}
}
int** expandList(int** num,int m,int n) {
int** matrix = new int* [2*m];
for (int i = 0; i < 2 * m; i++) {
matrix[i] = new int[2*n];
}
for (int i = 0; i < 2 * m; i++) {
for (int j = 0; j < 2 * n; j++) {
matrix[i][j] = num[i%m][j%n];
}
}
return matrix;
}
int main()
{
int n,m;
cin >> m >> n;
int** inputArray = new int* [m];
for (int i = 0; i < m; i++) {
inputArray[i] = new int[n];
}
for (int i=0; i < m; i++) {
for (int j=0; j < n; j++) {
cin >> inputArray[i][j];
}
}
// 将数组拓展开,1x1展成2x2
int** matrix = expandList(inputArray,m,n);
// 初始化最大值
maxNum = -1e9;
// i从0层开始到最后一层
for (int i = 0; i < 2*m-1; i++) {
int* nums = new int[n * 2]{0};
// j从i层开始到最后一层
for (int j = i; j < 2*m-1; j++) {
// 如果层数越界了,直接break
if (j - i >= m) {
break;
}
// 压缩i到j层变成一维数组
for (int k = 0; k < 2*n; k++) {
nums[k] += matrix[j][k];
}
//题目有数组长度限制
//左边界从0开始,到n-1就可以结束
for (int k = 0; k < n; k++) {
// 找到最大连续子序列和
// 右边界从k到k+n-1
for (int q = k; q < k + n; q++) {
count(nums, k, q);
}
}
}
}
cout << maxNum << endl;
return 0;
}