DP经典问题——最大子段和

1.问题描述:

最大子段和是一个经典的DP问题。
比如给定一个序列: 2, -1 , 3 , -5 , 3
可以推测出最大子段和为 2 - 1 + 3 = 4
题目要求输入一段序列,输出最大的子段和。

2.算法分析:

什么是子段和?
就是在整个序列的子区间中最大的和。
我们首先要找到这个问题的状态转移方程。
如何设计状态?
我们可以发现一个问题,我们可以将每一个子区间的和算出来。
比如我们使用dp[i] 表示 从1 - i的子段和。
那么状态 i 该怎么来。
可以发现它可以合并之前的dp[i - 1],也可以重新开始作为区间的起始端点。
所以可以写出状态转移方程:
dp[i] = max(dp[i - 1] + a[i],a[i])
dp[i - 1] + a[i] 代表的是合并进入区间
a[i]代表结束之前的区间,另起炉灶。
DP的关键就是寻找状态转移方程,如何设计状态,如何设计转移。
本人也刚入门,大家一起学习。

3.源代码:

#include 
#include 
using namespace std;

int a[1005],dp[1005];

int main () {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++) {
		dp[i] = max(dp[i - 1] + a[i], a[i]);
	}
	int ma = 0;
	for (int i = 1; i <= n; i++) {
		ma = max(ma, dp[i]);
	}
	cout << ma << endl;
	return 0;
}

欢迎关注:
ly’s Blog

你可能感兴趣的:(DP,落谷,C++)