以第一个样例为例:
对于第i个数前的最大序列和,我们有两种求解方法:
1、用第i-1个数前的最大序列和加上第i个数,也就是:dp[i-1]+a[i];
2、从头开始,直接为第i个数,也就是a[i];
总结:
dp[i]=max(dp[i-1]+a[i],a[i]);
找到递推公式后,我们还需要进行初始化:dp[1]=a[1] 即可。
完整代码:
#include<iostream>
using namespace std;
const int N = 1e6+3;
int a[N],dp[N];
int main()
{
int n;
while (cin >> n)
{
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
dp[1] = a[1];
int max = dp[1];
for (int i = 2; i <= n; i++)
{
dp[i] = dp[i - 1] + a[i] > a[i] ? dp[i - 1] + a[i] : a[i];
if (dp[i] > max)max = dp[i];
}
cout << max << endl;
}
}
当然,除此之外我们还可以用其他方法来解答:前缀和,分治法等;