经典的DP了,跟这题打交道也有许久了,简而言之,就是求子矩阵的最大和。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int a[103][103];
int b[103];
int i,j,k,p,q,n;
while(~scanf("%d",&n))
{
int max = -100000;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(i=1;i<=n;i++)
{ //按行压缩
for(j=i;j<=n;j++)
{ //将第 i 行 到 第 j行 压缩为一行
memset(b,0,sizeof(b));
for(p=1;p<=n;p++)
{
for(q=i;q<=j;q++)
{
b[p] += a[q][p];
}
}
for(k=1;k<=n;k++)
{
if(b[k]>0)
{
b[k+1] += b[k]; //DP问题求解最大子序列
}
}
for(k=1;k<=n;k++)
{
if(max<b[k])
max = b[k]; //求出最大值
}
}
}
printf("%d\n",max);
}
system("pause");
}