题目
见https://www.acwing.com/problem/content/128/
思路
见https://www.acwing.com/video/123/,把一个二维问题转化成了一维的问题,时间复杂度优化到O(n^3)
代码:
#include<iostream>
#include<climits>
#include<algorithm>
using namespace std;
const int N=110;
int g[N][N];
int main()
{
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=INT_MIN;
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];//本题思路精髓所在
res=max(last,res);
}
}
cout<<res<<endl;
return 0;
}