POJ 1003

求最大子段和(动态规划求解)   //从前往后,用sum保存当前情况下的最优解,b用于工作

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
	int n,m,tcase=0;
	cin>>n;
	while(n--)
	{
        cin>>m;
		int b=0,besti=1,bestj=1,sum=0,pos=1,num;
		cin>>num;
		sum=b=num;            //前面几次WA是因为没有这句话
		for(int i=2;i<=m;i++)
		{
			cin>>num;
			if(b<0)
			{
				pos=i;         //一定要有这句,相当于重新开始
				b=num;
                
			}
			else  b+=num;
			if(b>sum)
			{
				sum=b;
				bestj=i;
				besti=pos;
			}
		}
		tcase++;
		cout<<"Case "<<tcase<<":"<<endl;
		cout<<sum<<" "<<besti<<" "<<bestj<<endl;
		if(n) cout<<endl;
	}
   return 0;
}

  

如果输入的数据想要保存在数组a中,则可以建立动态数组

int *a=new int [n+1];

//在结束时,要销毁数组a

delete[] a;
a=NULL;

 

 

经典的动态规划问题,与背包问题类似

算法分析:求最大字段和,d[i]表示i 结尾(字段和中包含 i )在 a[1..i] 上的最大和,d[i]=(d[i-1]+a[i]>a[i])?d[i-1]+a[i]:a[i];
max = {d[i],1<=i<=n} ;
 
posted @ 2014-04-30 16:06  zhoudan  阅读(97)  评论(0)    收藏  举报