题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081
先求每列第一个元素到每个元素的和 s[i][j] = s[i-1][j] + num[i][j];
在求第i行到 j 行的每列的和(1<= j < i <= n)t[k] = s[i][k] - s[j][k] (k表示这行第几列元素)
每求出一组t[n],求一次最大字段和
#include <stdio.h>
#include <string.h>
int s[110][110];
int num[110][110];
int t[110];
int dp[110];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,tmp;
int i,j,k;
while(~scanf("%d",&n))
{
tmp = -0xffff;
memset(s,0,sizeof(s));
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
scanf("%d",&num[i][j]);
s[i][j] = s[i-1][j] + num[i][j];
}
}
for(i = 1; i <= n; i++)
{
for(j = 0; j < i; j++)
{
for(k = 1; k <= n; k++)
{
t[k] = s[i][k]-s[j][k];
dp[k] = max(dp[k-1]+t[k],t[k]);
if(dp[k] > tmp)
tmp = dp[k];
}
}
}
printf("%d\n", tmp);
}
return 0;
}