#include <iostream>
#include "cstring"
#include <stdio.h>
#include "iomanip"
#include "vector"
#include "cmath"
#include "stack"
#include "algorithm"
#include <math.h>
#include "map"
#include "queue"
using namespace std;
int main()
{
freopen("a.txt","r",stdin );
int n;
cin>>n;
int i,j,k,a[111][111]={0},maxx=0 ,h;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cin>>a[i][j];
}
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
int dp[111]={0};
memset(dp,0,111);
for( h=i;h<=j;h++)
for( k=0;k<n;k++)
{
dp[k]+=a[h][k];
}
for(int q=1;q<n;q++)
{
dp[q]=max(dp[q-1]+dp[q],dp[q]);
maxx=max(maxx,dp[q]);
}
}
}
cout<<maxx;
}
当数据是一维时候,状态转移方程为 dp[i]=max(dp[i-1]+a[i],dp[i]) ,那么扩充到二维呢?还是一样的,我们把矩阵一列看成是一个数也就是一维,就要枚举列相加的全部情况,对每种列相加的情况来一遍dp,如果会了一维的最长连续和,那么只需理解枚举列相加就可以了