zoukankan      html  css  js  c++  java
  • 一个简单的问题- 最大连续子序列和

    题目描述

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

  • 相关阅读:
    公众号我也快看不下去了
    朋友圈我快看不下去了!
    微信5.2
    微信支付类目及费率
    ACCESS TOKEN
    关于微博认证和微信认证
    重定向
    微信公众账号支付商户接入指南
    微信公众平台开发(94) 违章查询
    [Servlet]什么是Servlet
  • 原文地址:https://www.cnblogs.com/jihe/p/4535498.html
Copyright © 2011-2022 走看看