思路:
矩阵压缩,从二维变一维,求最大子序和。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <string>
#include <vector>
#include <set>
#define ll long long
using namespace std;
int n,a[125][125],b[125][125],dp[125],ma=-0x7fffffff;
void f(int j)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
dp[i]=max(b[j][i],b[j][i]+dp[i-1]);
ma=max(ma,dp[i]);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin >> a[i][j];
for(int i=1;i<=n;i++)
{
memset(b,0,sizeof(b));
for(int j=i;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
b[j][k]=a[j][k]+b[j-1][k];
}
f(j);
}
}
cout << ma << endl;
return 0;
}