資料結構與演算法——給定整數A1,A2,....An,....(可能有負數),求該資料序列的最大子序列的和

readyao發表於2016-01-05

求最大的子序列和問題

給定整數A1,A2,....An,....(可能有負數),求該資料序列的最大子序列的和。
比如:輸入-2, 11, -4, 13, -5, -2; 答案是20(11,-4,13三個連續數字的和)

我們遍歷一次資料序列,當每次的this_sum大於最大值的時候就更新max_sum的值。當this_sum小於0的時候,就把它置為0,再從當前位置開始計算(每次求和的結果小於0,就從下一個資料開始求和)。
還有一點要清楚,最大序列的第一個數字不可能小於0。可以看出該演算法的時間複雜度是O(n);
該問題還有其它幾種時間複雜度比較高的演算法。具體看:資料結構與演算法分析C++描述(2.3章節)

/*************************************************************************
	> File Name: max_seq_sum.cpp
	> Author: 
	> Mail: 
	> Created Time: 2016年01月05日 星期二 19時49分30秒
 ************************************************************************/

#include<iostream>
#include <vector>
using namespace std;

void input_data(vector<int> & data)
{
    int tmp;

    cout << "輸入資料序列:" << endl;
    while(cin >> tmp){
        data.push_back(tmp);
    }
}

void output_data(vector<int> & data)
{
    cout << "輸入的資料序列:" << endl;
    for (int i = 0; i < data.size(); ++i)
        cout << data[i] << " ";
    cout << endl;
}

int max_seq_sum(vector<int> & data)
{
    int max_sum = 0, this_sum = 0;
    for (int i = 0; i < data.size(); ++i){
        this_sum += data[i];
        
        if(this_sum > max_sum)
            max_sum = this_sum;
        else if(this_sum < 0)
            this_sum = 0;
    }
    return max_sum;
}
int main()
{
    vector<int> data;
    //輸入資料
    input_data(data);

    output_data(data);

    cout << "最大序列的值是: ";
    cout << max_seq_sum(data) << endl;

    return 0;
}


相關文章