POJ 1050 To the Max

題目鏈接: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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章