zoukankan      html  css  js  c++  java
  • 求最长连续子序列(动态规划)

    题目链接

    题目描述

        给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20。现在增加一个要求,即还需要输出该子序列的第一个和最后一个元素。

    输入描述:

        测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( K< 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。

    输出描述:

        对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
    示例1

    输入

       6
    -2 11 -4 13 -5 -2
    10
    -10 1 2 3 4 -5 -23 3 7 -21
    6
    5 -8 3 2 5 0
    1
    10
    3
    -1 -5 -2
    3
    -1 0 -2
    0
    

    输出

    20 11 13
    10 1 4
    10 3 5
    10 10 10
    0 -1 -2
    0 0 0

    题目分析:本题是在最大连续子序列和的基础上稍加改动
    最大连续子序列问题属于简单的动态规划dp[i]等于以a[i]结尾的连续序列的最大和
    状态转移方程为:dp[i] = max(a[i], dp[i-1] + a[i]);
    //求最大连续子序列和
    #include<iostream>
    using namespace std;
    int main()
    {
        int n;
        int a[10001];
        int dp[10001];
        int k;
        int i;
        int j;
        bool flag;
        while(cin>>n&&n!=0)
        {
            flag = false;//用来标志是否全为负数
            for(i=0;i<n;i++)
            {
                cin>>a[i];
                if(a[i]>=0)//如果出现正值则置为true
                    flag = true;
            }
            if(flag == false)
            {
                cout<<0<<" "<<a[0]<<" "<<a[n-1]<<endl;
                continue;      //全为负时输出,退出该层循环
            }
    
            dp[0] = a[0];  //边界值
            for(i=1;i<n;i++)
            {
                dp[i] = max(a[i], dp[i-1] + a[i]);//根据状态转移方程求dp
            }
            //寻找最大值以及其对应的最后一个元素所在的下标
            k = 0;
            for(i = 0;i<n;i++)
            {
                if(dp[k]<dp[i])
                    k = i;
            }
            //寻找最小元素
            for(i = k;i>=0;i--)
            {
                if(dp[i]==a[i])
                {
                    j = i;
                    break;
                }
            }
            cout<<dp[k]<<" "<<a[j]<<" "<<a[k]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    【反射】Java反射机制
    Composer教程之常用命令
    Composer教程之基础用法
    Composer教程之初识Composer
    Composer 的结构详解
    现代 PHP 新特性系列(七) —— 内置的 HTTP 服务器
    现代 PHP 新特性系列(一) —— 命名空间
    现代 PHP 新特性系列(二) —— 善用接口
    现代 PHP 新特性系列(三) —— Trait 概览
    现代 PHP 新特性系列(四) —— 生成器的创建和使用
  • 原文地址:https://www.cnblogs.com/ttzz/p/10584208.html
Copyright © 2011-2022 走看看