hdoj 1231



Problem Description
K個の整数のシーケンス{N 1,N 2,…,NK}が与えられており、その任意の連続するサブシーケンスは{Ni,Ni+1,…と表してもよい.
Nj}のうち、1<=i<=j==K.最大連続サブシーケンスは、すべての連続サブシーケンスの要素と最大のものであり、
シーケンス{−2,11,−4,13,−5,−2}が与えられており、その最大連続サブシーケンスは{11,−4,13}であり、最大および最大値は、−2}である.
は20です
今年のデータ構造の答案用紙の中で、編纂のプログラムが最大を得ることを求めて、今1つの要求を増加して、つまりまた出力しなければなりません.
サブシーケンスの最初の要素と最後の要素.
Input
テスト入力はいくつかのテストケースを含み、各テストケースは2行を占め、1行目は正の整数K(<10000)を与え、2行目はK個の整数を与え、中間はスペースで区切られる.Kが0の場合、入力は終了し、この用例は処理されない.
Output
各テストケースに対して、1行の中で最大と最大連続サブシーケンスの最初と最後の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
えっと、この問題は見たところ考えがありますが、いつも欠点があります.
最大の子串とを求めます.考えは前の総和が0より大きいのでさえすれば、彼を捨てるべきではないです.前のものと0より小さいものなら、私達は彼を捨てて、このようにして最大の子串和を求めることができます.
位置を求めると、後ろの位置が求められます.そして一番大きい位置と前の位置を求めます.
{int n;while(scanf("%d"、&n){if(n==0)break;int=a=new int[n];int i;biaoji=0;for(i=0;i+i+){scanf(%"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""(i=0;imax){max=sum;last=i;}if(sum<0){sum=0;}if(biaoji==1){int sum 2=0;int=0;d=0;for(int i=last;i>=0;i--)/終点があります.前に出発点{sum 2+=a[i];if(sum 2==max){d=i;break;}print f(“%d%d%d%d%d”、max、a[last];else{printf(“%d=”a=)