zoukankan      html  css  js  c++  java
  • 最大连续子序列

    Description
    给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., 
    Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
    例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
    为20。
    在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
    子序列的第一个和最后一个元素。
    Input
    测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( < 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。
    Output
    对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元 
    素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
    SampleInput
    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
    SampleOutput
    20 11 13
    10 1 4
    10 3 5
    10 10 10
    0 -1 -2
    0 0 0
    状态:f[i]:以i为结尾最长连续序列
    状态转移:f[i]=max{f[i-1]+a[i],a[i]}
    初始状态:f[1]=a[i]
    要求最大的,只需从f[]找出最大值就行了
     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main(){
     5     int f[1000];
     6     int a[1000];
     7     int s[1000];
     8     int i,k,st,end,Max;
     9 
    10         while(cin>>k,k){
    11             for(i=1;i<=k;i++){
    12                 cin>>a[i];
    13             }
    14         
    15             f[1]=a[1];
    16             s[1]=1;
    17             end=1;
    18 
    19             for(i=2;i<=k;i++){
    20                 if(f[i-1]+a[i]>=a[i]){
    21                     f[i]=f[i-1]+a[i];
    22                     s[i]=s[i-1];
    23                 }
    24                     else {f[i]=a[i];
    25                     s[i]=i;}
    26             }
    27             
    28                 Max=f[1];
    29             for(i=1;i<=k;i++)
    30             {
    31                 if(f[i]>Max){
    32                     Max=f[i];
    33                     end=a[i];
    34                     st=s[i];
    35                 }
    36             
    37             }
    38             if(Max<0)
    39                 cout<<0<<" "<<a[1]<<" "<<a[k]<<endl;
    40         else cout<<Max<<" "<<a[st]<<" "<<end<<endl;
    41             }
    42 
    43 return 0;
    44             }
    View Code
  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/to-creat/p/4891124.html
Copyright © 2011-2022 走看看