“最大連續子段和”問題 | 51nod 2076

問題描述

給定有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[]表示給出的數組:

dp[i+1]=max{dp[i]+num[i],num[i]}

最大連續子段和就是最大連續前子段中最大的那一個值,其中N表示總個數:

max_num=max{dp[i],1≤i≤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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章