1. 程式人生 > >hdu1003Maxsum(最大子列和問題)

hdu1003Maxsum(最大子列和問題)

這道題開始一直是Time Limit Exceeded,後來改動了又Wrong Answer,然後就是Presentation Error,改著改著終於AC了

題目連結:hdu1003

這是一道動態規劃的題目,即求最大子序列和:給定一列數a[1],a[2].....a[n],求a[i]+...a[j](1<=i<=j<=n)連續序列最大

Sample Input

2 5 6 -1 5 4 -7

7 0 6 -1 1 -6 7 

Sample Output

Case 1: 14 1 4

Case 2: 7 1 6

 

主要的思路就是以狀態maxdp[i]表示最大子列和,可以先令maxdp[0]=a[0],從第二項開始找,如果為正,則,tmpdp[i]=tmpdp[i-1]+a[i]

;如果為負,則,tmpdp[i]=a[i];

狀態轉移方程:tmpdp[i] = tmpdp{a[i], tmpdp[i-1]+a[i]};

特別要注意的是這題的格式最後一個樣例沒有空行,要進行判斷,有些資料還要重新初始化

#include<stdio.h>

#define MAX 100001

long tmpdp[MAX];
int a[MAX];


int main()
{
	int j=1;
	int start,start1,end;
	long MAXdp;//當前最大和
	int T;//輸入兩行
	long i,m;
	scanf("%d",&T);
	while(T)
	{
		start=start1=end=0;
		MAXdp=0;
		scanf("%ld",&m);//一行中元素的個數
		
		
		for(i=0;i<m;i++)
		{
			scanf("%d",&a[i]);
			tmpdp[i]=0;
		}
		
		MAXdp=a[0];
		tmpdp[0]=a[0];
		
		for(i=1;i<m;i++)
		{
			
			if(tmpdp[i-1]>= 0)
			{ 
				tmpdp[i] = tmpdp[i-1]+a[i];
				
			}	
			else小於0時,即把tmp[i-1]置為0
			{
				tmpdp[i]= a[i];
				start1=i; //記錄子列的起始位置
			}
			if(tmpdp[i]>MAXdp)//更新子列最大和
			{
				MAXdp=tmpdp[i];
				start=start1;//更新初始位置
				end=i;//更新末位置
			}
			
		}
	
		printf("Case %d:\n",j);
		printf("%ld %d %d\n",MAXdp,start+1,end+1);
		if(T!=1)
		{
			printf("\n");
		}
		j++;
		T--;
	}


	return 0;	
} 

最大子列和問題主要是理解狀態轉移方程:tmpdp[i] = tmpdp{a[i], tmpdp[i-1]+a[i]};不斷地去更新最大子列的和就可以了。