zoukankan      html  css  js  c++  java
  • 【两段连续不重合子序列和最大】 动态规划

    最大子序列

    TimeLimit: 1 Second MemoryLimit: 32 Megabyte

    Totalsubmit: 156 Accepted: 42

    Description

    给定一个N个整数组成的序列,整数有正有负,找出两段不重叠的连续子序列,使得它们中整数的和最大。两段子序列都可以为空。

    Input

    多组输入,每组第一行为N,表示序列的长度;第二行为N个整数,表示输入序列。
    0<N<=1,000,000

    Output

    对于每组输入,输出一行,仅一个整数,表示最大的和。

    Sample Input

    9
    185 -580 -889 701 964 -878 353 -761 608

    Sample Output

    2273

    Hint

    样例输入序列的一种选择为:(701 964)和(608),整数的范围为(-1000,1000)

    #include <iostream>
    #include <cstdio>
    using namespace std;
    const int INF=1000005;
    int s[INF],lt[INF],rt[INF],dp[INF];
    int main()
    {
        //freopen("in.txt","r",stdin);
        int i,n;
        while(cin >> n)
        {
            for (i=1;i<=n;i++)scanf("%d",&s[i]);
            dp[n+1]=dp[0]=-INF;
            lt[0]=rt[n+1]=-INF;
            for (i=1;i<=n;i++)//正向
            {
                dp[i] = max(dp[i-1]+s[i],s[i]);
            }
             for (i=1;i<=n;i++)
             {
                 lt[i] = max(dp[i],lt[i-1]);
    //             lt[i] = dp[i];
             }
            for (i=n;i>=1;i--)  //逆向
            {
                dp[i] = max(dp[i+1]+s[i],s[i]);
            }
             for (i=n;i>=1;i--)
             {
                 rt[i] = max(dp[i],rt[i+1]);
    //                rt[i] = dp[i];
             }
             int sum=-INF;//枚举
            for (i=1;i<=n;i++)
            {
                sum = max(sum,lt[i]+rt[i+1]);
            }
            if(sum<=0)
            cout <<'0' <<endl;
            else printf("%d
    ",sum);
        }
        return 0;
    }
     
     
  • 相关阅读:
    学习笔记2
    带有循环的存储过程
    经典SQL语句大全
    关于职业的一些看法
    把dataTable表批量的写入数据库
    抽奖接口,每天只能抽奖3次,而且必须先登录才能抽奖的小程序
    调用获取学生信息的接口,保存到excel里面的小程序
    内置函数补充
    好用的模块
    网络编程
  • 原文地址:https://www.cnblogs.com/balfish/p/4015149.html
Copyright © 2011-2022 走看看