一、问题
给定n个整数(可能为负数)组成的序列a1,a2,a3,...,an,求该序列的子段和的最大值。
二、思路
总体有三总思路:穷举算法(简单算法)、分治算法和动态规划。下面就讲一下动态规划方法。
设b[i]为前i个中且包含第i个元素的最大子段和。
则b[i+1] = max{b[i] + a[i+1], a[i+1]}
因为b[i+1]分为两种情况:
1、b[i] > 0 时,则可以将b[i] 接在 a[i+1]前面形成最大字段和(因为前面的是正数,对最大值有贡献)
2、b[i] <=0 时,则b[i+1] = a[i+1](因为前面的无贡献,为0,或贡献为负)
三、代码
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n], b[n];
for(int i=0; i<n; i++)
cin>>a[i];
b[0] = a[0];
int Max = b[0];
for(int i=1; i<n; i++){
b[i] = max(b[i-1]+a[i], a[i]);
if(b[i] > Max) Max = b[i];
}
cout<<Max<<endl;
return 0;
}