問題描述
給定有n個整數(可能爲負整數)組成的序列a1,a2,…,an,求該序列連續的子段和的最大值。
如果該序列的所有元素都是負整數時定義其最大子段和爲0。例如,當(a1,a2,a3,a4,a5)=(-5,11,-4,13,-4-2)時,最大子段和爲11+(-4)+13=20。
輸入
第一行整數個數N
第二行爲N個整數,每個整數之間用一空格隔開。
1<=N<=100000
N個整數的範圍爲-1000到1000
輸出
一行一個數,表示最大連續子段和的值
輸入樣例
5
384 -37 44 101 -377
輸出樣例
492
思路
動態規劃題目。
首先,定義一個概念,最大連續前子段。對於數組中的第i項元素,如果存在一個k(k<i),使得從第k項到第i項的和最大,那麼這個k就是一個臨界點,從第k項到第i項的字段就是第i項的最大連續前子段。
所以,我們用一個數組dp[]來表示第i項的最大連續前子段的和,就有了以下遞推公式,其中num[]表示給出的數組:
最大連續子段和就是最大連續前子段中最大的那一個值,其中N表示總個數:
參考代碼:
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100010;
int dp[maxn];
int num[maxn];
int main(){
int N;
cin >> N;
for(int i = 1; i <= N; i ++){
cin >> num[i];
}
int max_num = 0;
for(int i = 1; i <= N; i ++){
dp[i] = max(dp[i - 1] + num[i], num[i]);
if(dp[i] > max_num) max_num = dp[i];
}
cout << max_num << endl;
return 0;
}