输入样例:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
输出样例:
15
本题一开始也是没有思路,后来看视频知道把二维变一维(牛逼!)
https://www.acwing.com/activity/content/problem/content/3455/1/
主要思路
如上图所示,先把i-j之间的小方块(区域)的和求出来(前缀和),然后求这一行中的最大连续子序列和。
时间复杂度是o(n^3)级别。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int N=110;
int g[N][N];
int main(void)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{ cin>>g[i][j];g[i][j]+=g[i-1][j];}
int res=-400;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
int last=0;
for(int k=1;k<=n;k++)
{
last=max(last,0)+g[j][k]-g[i-1][k];//i*j*k相当于一维数组的一个单位然后求最长连续子序列和
res=max(res,last);
}
}
cout<<res;
}