題目鏈接:http://poj.org/problem?id=1050
解析:其實就是把j->k之間的列都看成求一維數組的最大子序列之和,是一種頗爲簡單的dp,看了大牛的博客才懂的╮(╯▽╰)╭革命尚未成功,同志仍需努力啊
//算法:num[i][j]存的是第i行中前j個數的和,這樣的話,num[i][k]-num[i][j]就是第i行,j->k列的小矩陣的和
#include<stdio.h>
#include<string.h>
int num[110][110],n;
int main()
{
while(scanf("%d",&n) != EOF)
{
memset(num,0,sizeof(num));
int a;
for(int i = 1; i <= n ; i ++)
{
for(int j = 1 ; j <= n ; j ++)
{
scanf("%d",&a);
num[i][j] = num[i][j-1]+a; //num[i][j]存的是第i行中前j個數的和
}
}
int sum = 0,max = -1;
for(int j = 1 ; j <= n ; j ++)//j和k就是代表列的兩個遊標
{
for(int k = j; k <= n ; k++)
{
sum = 0;
for(int i = 1 ; i <= n ; i++)
{
sum < 0 ? sum = 0:0;//特別重要,當j,k固定時,就可以用這個來求出該列最大的,例如j = k = 1時,
//如果第一列的數值爲-3,2,4時,這樣的話就可以枚舉到最大的是2+4 = 6,因爲-3被 //刪除了,這樣保證了sum始終是
//最大的.否則的話sum就不能枚舉2,4這個矩陣了。其實就是最大子序列和的dp
sum += num[i][k] - num[i][j-1];
max < sum ? max = sum:0; //sum每更新一次就求一次max
}
}
}
printf("%d\n",max);
}
return 0;
}