程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu1003 Max Sum(dp)

hdu1003 Max Sum(dp)

編輯:C++入門知識

hdu1003 Max Sum(dp)


Max Sum

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



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

Author Ignatius.L
題意:求最大子序列和。 分析:詳解請看代碼。
#include 
using namespace std;

int T,n,m;
int post1,post2,x;//post1表示序列起點,post2表示序列終點,x表示每次更新的起點
int max,now;//max表示最大子序列和,now表示各個子序列的和
int i,j;

int main ()
{
    scanf (%d,&T);
    for (i=1; i<=T; i++)
    {
        scanf (%d%d,&n,&m);
        max = now = m;
        post1 = post2 = x = 1;//初始化
        for (j=2; j<=n; j++)
        {
            scanf (%d,&m);
            if (now + m < m)//對於每個數,如果該數加上當前序列和比本身還小
            {
                now = m;//更新區間
                x = j;//更新起點
            }
            else
            now += m;//否則把該數加進序列
            if (now > max)//如果當前序列和比已有最大序列和大,更新
            {
                max = now;
                post1 = x;//記錄新的起點和終點
                post2 = j;
            }
        }
        printf (Case %d:
,i);
        printf (%d %d %d
,max, post1, post2);
        if (i != T)
        printf (
);
    }
    return 0;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved