• hdu1003-Max Sum


    Max Sum

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


    Problem Description
    Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.
     
    Input
    The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).
     
    Output
    For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.
     
    Sample Input
    2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
     
    Sample Output
    Case 1:
    14 1 4
     
    Case 2:
    7 1 6
     

    这道题与“最大连续子序列和”类似,所以还是用类似的dp思想。

    只是最大连续子序列和多了一个注:【注】:为方便起见,如果所有整数均为负数,则最大子序列和为0。

    在讨论里找的多几组测试数据

    4 0 0 2 0 —— 2 1 3
    6 2 7 -9 5 4 3 —— 12 1 6
    4 0 0 -1 0 —— 0 1 1
    7 -1 -2 -3 -2 -5 -1 -2 —— -1 1 1
    6 -1 -2 -3 1 2 3 —— 6 4 6
    ----------------------------------------------------------------------------------
    增加一组测试数据:
    5 -3 -2 -1 -2 -3 —— -1 3 3

     1 #include <iostream>
     2 #include <cstring>
     3 #include <algorithm>
     4 
     5 using namespace std;
     6 
     7 #define INF 0x3f3f3f3f
     8 #define MAXN 100010
     9 
    10 int main()
    11 {
    12     int T;
    13     cin >>T;
    14     int i, j;
    15     int a;
    16     for(i = 1;i <= T;++i)
    17     {
    18 //      可以推断出当 t > 0 时可由 t += a 计算出最大值(就像最大连续子序列和)
    19 //      当 t < 0 时,按照dp思想,dp[i] = max(dp[i-1] + a[i], a[i])
    20 //      所以分两种情况,t < a 时,t = a;
    21 //            
    22 //      t > a 时,t += a(这并不影响最大值ans,例如-1,-2,ans已经存了-1)
    23 //      为什么要 +=a?是为了保证子序列的连续,直到出现 t < a
    24         int n;
    25         cin >>n>>a;
    26         int t = a, l = 1, r = 1;
    27         int ans = a, num_start = 1, num_end = 1;
    28         for(j = 2;j <= n;++j)
    29         {
    30             cin >>a;  
    31             if(t < 0 && t < a)
    32             {
    33                 t = a;
    34                 l = r = j;
    35             }
    36             else
    37             {
    38                 t += a;
    39                 r++;
    40             }
    41             if(ans < t)
    42             {
    43                 ans = t;
    44                 num_start = l;
    45                 num_end = r;
    46             }
    47         }
    48         cout <<"Case "<<i<<":"<<endl
    49             <<ans<<" "<<num_start<<" "<<num_end<<endl;
    50         if(i != T)
    51             cout <<endl;
    52     }
    53     return 0;
    54 }
    现在所有的不幸都是以前不努力造成的。。。
  • 相关阅读:
    Navicat连接mysql出现10061/10060错误的解决
    对话守则
    一次Django admin bug解决的思维过程
    Think different
    SVN版本库的迁移
    Windows Phone 8 锁屏背景与通知
    Windows Phone 7 应用升级 Windows phone 8 方案预览 选择合适的 Key Feature
    从 windows phone7 到 windows phone 8 更新 如何设配两个版本
    windows phone 8 语音 Speech for Windows Phone 8
    windows phone 8 中的应用间通信
  • 原文地址:https://www.cnblogs.com/shuizhidao/p/8782747.html
Copyright © 2020-2023  润新知