一个简单的问题- 最大连续子序列和

题目描述

给定一整型数列{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;

原文地址:https://www.cnblogs.com/jihe/p/4535498.html