zoukankan      html  css  js  c++  java
  • HDOJ1231 最大连续子序列[DP入门]

    最大连续子序列

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 11260    Accepted Submission(s): 4745


    Problem 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,输出整个序列的首尾元素。
     
    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
    Hint
    Hint
    Huge input, scanf is recommended.
     
    Source
     
    Recommend
    JGShining
     
     
    写的有点乱!乱写的- -
    code:
     1 /*
     2 6
     3 -2 11 -4 13 -5 -2
     4 10
     5 -10 1 2 3 4 -5 -23 3 7 -21
     6 6
     7 5 -8 3 2 5 0
     8 1
     9 10
    10 3
    11 -1 -5 -2
    12 3
    13 -1 0 -2
    14 0
    15 */ 
    16 #include<iostream>
    17 using namespace std;
    18 
    19 int data[10002];
    20 int mcs[10002]; 
    21 
    22 int main()
    23 {
    24     int k;
    25     int i;
    26     int flag;
    27     int front,tail; 
    28     int max;
    29     int temp;
    30     while(~scanf("%d",&k),k)
    31     {
    32         flag=0;
    33         for(i=0;i<k;i++)
    34         {
    35             scanf("%d",&data[i]);
    36             mcs[i]=data[i];
    37             if(data[i]>=0)
    38                 flag++;;
    39         }
    40         if(!flag)
    41             printf("0 %d %d\n",data[0],data[k-1]);
    42         else
    43         {
    44             max=data[0];
    45             tail=0;
    46             if(k==1)
    47             {
    48                 printf("%d %d %d\n",data[0],data[0],data[0]);
    49                 continue;
    50             }    
    51             for(i=1;i<k;i++)
    52             {
    53                 if(mcs[i-1]>=0)
    54                 {
    55                     mcs[i]=mcs[i-1]+data[i];
    56                     if(mcs[i]>max)
    57                     {
    58                         max=mcs[i];
    59                         tail=i;
    60                     }
    61                 }
    62                 else
    63                 {
    64                     mcs[i]=data[i];
    65                     if(mcs[i]>max)
    66                     {
    67                         max=mcs[i];
    68                         tail=i;
    69                     }
    70                 } 
    71             }
    72             temp=max;
    73             for(i=tail;;i--)
    74             {
    75                 temp-=data[i];
    76                 if(!temp)
    77                 {
    78                     front=i;
    79                     break;
    80                 }
    81             }
    82             printf("%d %d %d\n",max,data[front],data[tail]);
    83         }
    84     }
    85     return 0;
    86 }






                If you have any questions about this article, welcome to leave a message on the message board.



    Brad(Bowen) Xu
    E-Mail : maxxbw1992@gmail.com


  • 相关阅读:
    取最小未用的账号
    Oracle 同义词
    RMAN备份报 RMAN-06059 错误
    Oracle11g memory_target
    基础记录
    uboot启动流程
    android有关生命周期探讨
    can协议
    java虚拟机
    内存管理机制
  • 原文地址:https://www.cnblogs.com/XBWer/p/2593811.html
Copyright © 2011-2022 走看看