【PTA】PAT(A)1007の最大サブシーケンス合計(25分)

問題

ポータル:1007最大サブシーケンス和(25分)

説明

$ K $整数{$ N_ {1} $、$ N_ {2} $、$ ... $、$ N_ {K} $}のシーケンスを考えます。連続的なサブシーケンスは、{$ N_ {I} $、$ N_ {I + 1} $、$ ... $、$ N_ {J} $} iは、当量のj個の\の当量K $を\ $ 1 \当量であると定義されます。最大のサブシーケンスは、その要素の最大の合計を持っている連続サブシーケンスです。例えば、所与の配列{-2、11 -4、13 -5、-2}、最大サブシーケンスは、最大合計が20であると{11、-4、13}であり、
今では最大を見つけることになっています一緒に最大のサブシーケンスの最初と最後の番号の合計、。

入力

各入力ファイルには、1つのテストケースが含まれています。各ケースは2行を占めています。最初の行は正の整数$ K(\当量10000)$が含まれています。2行目は、スペースで区切って、$ K $の数字が含まれています。

出力

各テストケースのために、一緒に第一及び最大サブシーケンスの最後の数と一行最大和で出力、。数字は1つのスペースで区切る必要がありますが、行の末尾に余分なスペースがあってはなりません。最大サブシーケンスが一意でない場合には、出力最小インデックス(サンプル場合によって示されるように)$ I $および$ jは$を有するもの。すべての$ K $番号が負の場合、その最大の和が0になるように定義され、そしてあなたが最初に全体のシーケンスの最後の番号を出力することになっています。

サンプル

サンプル入力

10
-10 1 2 3 4 -5 -23 3 7 -21

サンプル出力

10 1 4

溶液

分析

タイトルは最大の連続配列を必要とし、与えられたシーケンスが計算されます。
累積、もし「暫定最大と」更新「の最大値と」第1の位置と終了位置を含む情報を、「最大」より大きい;「仮の最大値と」0未満、一時第1の位置マークなら現在の位置を変更した後、0に「最も大きく、一時的な」割り当てを再インストールし、理由は0未満の場合は、その後順番に、シーケンスが削減されます。
:言語の組織あまりにも乱雑、他の人が参照提案劉手に負えないのブログ

コード

#include <bits/stdc++.h>
using namespace std;

int main(void) {
    int K, first_number, second_number, temp_first_number;
    long max_sum = -1, temp_max_sum = -1;

    cin >> K;
    int value[K];
    for (int i = 0; i < K; i++) {
        cin >> value[i];
        if (temp_max_sum < 0) {
            temp_first_number = value[i];
            temp_max_sum = 0;
        }
        temp_max_sum += value[i];
        if (temp_max_sum > max_sum) {
            max_sum = temp_max_sum;
            first_number = temp_first_number;
            second_number = value[i];
        }
    }
    if (max_sum == -1) {
        cout << "0 " << value[0] << " " << value[K - 1] << endl;
    } else {
        cout << max_sum << " " << first_number << " " << second_number << endl;
    }
}

おすすめ

転載: www.cnblogs.com/by-sknight/p/11441308.html