[HDU1231]最大連続サブシーケンス(単純な動的計画法)

最大の連続したサブシーケンス

時間制限:1000MSメモリ制限:32768KB 64ビットIOフォーマット:%I64d&%I64u

説明

K個の整数のシーケンス{N1、N2、…、NK}が与えられると、任意の連続サブシーケンスは{Ni、Ni + 1、…、
Nj}として表すことができます。ここで、1 <= i <= j <= Kです。最大の連続サブシーケンスは、すべての連続サブ
シーケンスの要素合計の最大のものです。たとえば、シーケンス{-2、11、-4、13、-5、-2}が与えられた場合、その最大の連続サブシーケンスは{11、- 4、13}、および最大
20。
今年の論文のデータ構造では、最大の増加を得るためにプログラミングが必要であり、
最初と最後の要素シーケンスも出力する必要がある要件になりました。

入力

テスト入力にはいくつかのテストケースが含まれ、各テストケースは2行を占め、最初の行は正の整数K(<10000)を示し、2番目の行はスペースで区切られたK個の整数を示します。Kが0の場合、入力は終了し、ユースケースは処理されません。

出力

各テストについて、1行目の最大出力と、
スペースで区切られた最大連続シーケンス要素の最初と最後の要素最大の連続サブシーケンスが一意でない場合は、シーケンス番号iとjが最小のサブシーケンスを出力します(入力サンプルの2番目と3番目のグループなど)。すべてのK要素が負の数の場合、最大合計は0として定義され、シーケンス全体の最初と最後の要素が出力されます。

サンプル入力

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

サンプル出力

20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0

ヒント

ヒント巨大な入力、scanfをお勧めします。

分析:
ここに写真の説明を書いてください
**時間計算量はO(N)です。
左から右へのシーケンスの合計が0未満の場合は、前のものを破棄し、この番号を開始点として開始します。
0以上の場合は、常時加算し、最大値を継続的に更新してください。最大値が更新された場合にのみ、格納された開始点LLが開始点として使用され(前のシーケンスよりも小さいが正の次のシーケンスの開始点の更新を回避するため)、終了点が更新されます。****

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"

using namespace std;

const int maxn = 1e4+5;

int num[maxn];

int main(){
    int n,max,sum;
    while(scanf("%d",&n),n){
        for( int i=0 ; i<n ; i++ ){
            scanf("%d",&num[i]);
        }
        int l,r,ll;
        max = num[0];
        sum = 0;
        l=num[0];
        r=num[0];
        for( int i=0 ; i<n ; i++ ){
            if(sum < 0){
                sum = num[i];
                ll = num[i];
            }
            else{
                sum += num[i];
            }
            if( sum > max ){
                max = sum;
                r = num[i];
                l=ll;
            }
        }
        if(max<0){
            printf("0 %d %d\n",num[0],num[n-1]);
        }
        else{
            printf("%d %d %d\n",max,l,r);
        }
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/thesprit/article/details/51970400