题目描述
给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n。
分析
继续用动态规划的思路来解决
由于是连续的子序列,所以可以用F[n]保存到第n个数时的最大值,然后取其中的最大值就可以了
代码实现:
int F[maxn]={0};cin>>n;
for(int i=1;i<=n;i++)
{
cin>>F[i];
if(F[i-1]>0) F[i]+=F[i-1];
}
int maxsum=max(F,F+n);
也行我们不但想知道连续子序列的最大和是多少,我们还想知道子序列在数列里面的开始和结束的坐标
我们对上面的代码进行一些改进就可以满足需要
//准确的说,不排除最大连续子序列前面的一部分和为0,所以上面的F[i-1]>0改为F[i-1]>=0,这样求出来的是符合要求的最长的子序列
我们需要定义maxsum,l,r,L,R;分别保存当前的最大和,当前序列的左右坐标
以及当前最大和的坐标
开始,对maxsum=无穷小
l=1,r=0,
代码:
int F[maxn]={0};
int l,r,L,R,maxsum;
maxsum=-NIF;
l=1;r=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>F[i];
if(F【i-1]>=0)
{
F【i】+=F【i-1];
++r;//当前坐标右移
}
else//不满足要求,那么当前左右坐标修改到当前位置
r=l=i;
if(F[i]>maxsum)
{
maxsum=F[i];
L=l;R=r;
}
}
cout<<maxsum<<endl;
cout<<L<<" "<<R<<endl;