• 最大连续子序列 HDU


    给定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,输出整个序列的首尾元素。
    Sample Input

    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

    Sample Output

    20 11 13
    10 1 4
    10 3 5
    10 10 10
    0 -1 -2
    0 0 0
    
    
            
     
    Huge input, scanf is recommended

    写得有点丑~~~
     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 using namespace std;
     5 
     6 int K;
     7 int a[10005],dp[10005];
     8 
     9 int main()
    10 {  while(~scanf("%d",&K)&&K!=0){
    11        
    12           int t=0;
    13           for(int i=1;i<=K;i++){
    14                  scanf("%d",&a[i]);
    15                  if(a[i]<0) t++;
    16           }
    17           if(t==K) printf("%d %d %d
    ",0,a[1],a[K]);
    18           else{
    19                  int sum=0,maxsum=-1e9,ans=-1e9,l=1,r=1,temp=1;
    20                  dp[0]=0;
    21                  for(int i=1;i<=K;i++){
    22                       dp[i]=max(dp[i-1]+a[i],a[i]);
    23                       ans=max(ans,dp[i]);
    24                  }     
    25                  for(int i=1;i<=K;i++){
    26                       sum+=a[i];
    27                       if(sum>maxsum){
    28                             maxsum=sum;
    29                             l=temp;
    30                             r=i;
    31                       }
    32                       if(sum<0){
    33                             sum=0;
    34                             temp=i+1;
    35                       }
    36                       if(ans==maxsum) break;
    37                  }
    38                  printf("%d %d %d
    ",ans,a[l],a[r]);
    39              }        
    40    }
    41 }
  • 相关阅读:
    vue点击实现箭头的向上与向下
    ES6中箭头函数加不加大括号的区别
    angular图片的两种表达方式
    通过添加类名实现样式的变化
    angular中路由跳转并传值四种方式
    Sublime Text 3 设置文件详解(settings文件)
    Second:eclipse配置Tomcat
    First:安装配置JDK and 部署Tomcat
    本地环境代码一码云一服务器代码部署
    2.sublime设置本地远程代码同步
  • 原文地址:https://www.cnblogs.com/zgglj-com/p/6810423.html
Copyright © 2020-2023  润新知