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} ;
浙公网安备 33010602011771号