1. 程式人生 > >HDU 1231 最大連續子序列:水dp

HDU 1231 最大連續子序列:水dp

一段 size pid 答案 定義 題意 如果 最大連續子序列 esp

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1231

題意:

  給你一個整數序列,求連續子序列元素之和最大,並輸出該序列的首尾元素(若不唯一,輸出首坐標最小的;首坐標相同輸出尾坐標最小的)。

題解:

  O(N)做法。

  定義sum為當前坐標i之前某一段元素[x,i-1]之和。

  三種情況:

    (1)sum > 0:說明之前的和對答案有貢獻,更新sum += a[i],tail = a。

    (2)sum < 0:前面的答案是拖後腿的。。。還不如從a[i]重新開始算,sum = a[i],head = a,tail = a。

    (3)sum = 0:可要可不要。但答案要求首坐標最小,就要了,同sum > 0的情況。

  如果某次sum > ans,則更新:ans = sum, lef = head, rig = tail

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #define INF 10000000
 5 
 6 using namespace std;
 7 
 8 int n;
 9 int a;
10 int ans;
11 int lef,rig;
12 int start,over; 13 14 int main() 15 { 16 while(cin>>n) 17 { 18 if(n==0) break; 19 int head; 20 int tail=-1; 21 int sum=-INF; 22 ans=-INF; 23 for(int i=0;i<n;i++) 24 { 25 cin>>a; 26 if(i==0) start=a;
27 if(i==n-1) over=a; 28 if(sum>=0) 29 { 30 sum+=a; 31 tail=a; 32 } 33 else 34 { 35 sum=a; 36 head=a; 37 tail=a; 38 } 39 if(sum>ans) 40 { 41 ans=sum; 42 lef=head; 43 rig=tail; 44 } 45 } 46 if(ans>=0) cout<<ans<<" "<<lef<<" "<<rig<<endl; 47 else cout<<"0 "<<start<<" "<<over<<endl; 48 } 49 }

HDU 1231 最大連續子序列:水dp