マックス合計
制限時間:1000分の2000 MS(Javaの/その他)メモリの制限:32768分の65536 K(Javaの/その他)
の合計提出(S):85953受理提出(S):19912
問題の説明
シーケンス[1]、[2]、[3] ...... [N]が与えられ、あなたの仕事は、サブシーケンスの最大合計を計算することです。例えば、(6、-1,5,4、-7)が与えられると、このシーケンスにおける最大合計は、6 +(-1)+ 5 + 4 = 14です。
入力
入力の最初の行は整数テストケースの数を意味し、T(1 <= T <= 20)を含みます。次いで、Tラインは、次の各ライン番号N(1 <= N <= 100000)で始まり、その後、N個の整数は(すべての整数は、-1000〜1000の間である)に続きます。
出力
各テストケースのために、あなたは、出力の2行をする必要があります。、#はテストケースの数を意味します。最初の行は、「ケース#」です。2行目は三つの整数、配列中の最大合計、サブシーケンスの開始位置は、サブシーケンスの終了位置を含んでいます。以上の結果、出力最初のものがある場合。出力2例の間に空白行。
サンプル入力
2 5 6 -1 5 4 -7 7 0 6 -1 1-6 7 -5
サンプル出力
ケース1:14 1 4ケース2:7 1 6
1 #include <iostream>
2 using namespace std;
3
4
5 int main()
6 {
7 int numbers;
8 cin>>numbers;
9 for(int k =0;k<numbers;k++)
10 {
11 int num;
12 cin>>num;
13
14
15 int * number = new int [num];
16 int * start = new int [num];
17 int * b = new int [num];
18 for(int i=0;i<num;i++)
19 cin>>number[i];
20
21 b[0]= number[0];
22 start[0]=0;
23 for(int i=1;i<num;i++)
24 {
25 if(b[i-1]+number[i]>=number[i])
26 {
27 b[i]=b[i-1]+number[i];
28 start[i]= start[i-1];
29 }
30 else
31 {
32 b[i]= number[i];
33 start[i]= i;
34 }
35 }
36 int max = b[0];
37 int pos=0;
38 for(int i=0;i<num;i++)
39 {
40 if(b[i]>max)
41 {
42 max=b[i];
43 pos = i;
44 }
45 }
46 cout<<"Case "<<k+1<<":"<<endl<< max<<" "<<start[pos]+1<<" "<<pos+1<<endl;
47 if(k!=numbers-1)
48 cout<<endl;
49 delete number;
50 delete start;
51 delete b;
52
53
54 }
55
56
57 return 0;
58
59
60
61 }
ます。https://my.oschina.net/u/204616/blog/545274で再現