题目链接:https://www.luogu.org/problemnew/show/P1719
这道题目关键在于将维度的技巧。若最大子矩阵从(i,j)到(i1,j1),可以将他们的同列加起来变成一维{(a(i,j)+a(i,j+1)+...+a(i,j1)),...,a(i1,j)+...a(i1,j1)}。然后再求最大子段问题(dp[i]=max(dp[i-1]+sum[i],sum[i])。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
const int maxn=600;
int n;
int dp[maxn][maxn]={},sum[maxn]={};
int solve(){ //求最大子段
int t=sum[1],ans=sum[1];
for(int i=2;i<=n;i++){
if(t<0) t=sum[i];
else t+=sum[i];
ans=max(t,ans);
}
return ans;
}
int main()
{
while(scanf("%d",&n)==1){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
scanf("%d