思路:
转换成 i行到j行 就是一个最大子序列求和问题
// sum[i][j] 表示前i行第j列的矩阵和
// ans=max(ans+sum[j][t]-sum[i][t],sum[j][t]-sum[i][t]);
// 三层循环表示 外两层 表示 i行到j行 第三层表示列
// 第三层用来比较第i到j行中每列的最大值为ans-
就转换成了最大连续子序列 不能用dp[i][j]表示i行到j行的最大和 因为还需要用一个循环比较i行到j行各列的最大和可参考最大连续子序列 这时因为二维的dp[i][j]无法存储原来算过的 除非弄成三维 所以直接简便用一个int型比较所有最大的
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<string.h>
using namespace std;
typedef int DataType;
const int maxn=110;
int N;
int sum[maxn][maxn]={0};
int max(int a,int b)
{
return a>b?a:b;
}
int DP()
{
int ans=0;
int M=-9999;
for(int i=0;i<=N;i++)
for(int j=i+1;j<=N;j++)
{
ans=0;
for(int t=1;t<=N;t++)
{
ans=max(ans+sum[j][t]-sum[i][t],sum[j][t]-sum[i][t]);
if(ans>M) M=ans;
}
}
printf("%d\n",M);
}
int main()
{
int k;
while(scanf("%d",&N)!=EOF)
{
memset(sum,0,sizeof(sum));
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
scanf("%d",&k);
sum[i][j]=sum[i-1][j]+k;
}
}
DP();
}
return 0;
}