题目链接:P1115 最大子段和
程序说明:
设dp[i]表示以第 i 个数结尾的最大字段和。根据递推式 dp[i] = max(a[i], dp[i - 1] + a[i]),说白了就是如果加上前一个数反而变小的话,就把前面的数都扔掉。
注意边界问题,因为第一个数如果是负数的话,有可能dp的起始值会被更新成0。。因此一定要注意dp起始值的初始化,然后从第二个数开始遍历。
代码如下:
#include <iostream>
using namespace std;
const int N = 200010;
int a[N], dp[N], n;
int main() {
cin>>n;
for(int i = 0; i < n; i++)
cin>>a[i];
dp[0] = a[0];
for(int i = 1; i < n; i++)
dp[i] = max(a[i], dp[i - 1] + a[i]);
int res = dp[0];
for(int i = 1; i < n; i++) {
res = max(res, dp[i]);
}
cout<<res<<endl;
return 0;
}