思路
用sum表示最大的和(全局最优),b表示局部最优。
核心公式:
- 搞一个b数组表,
b[i] = max(b[i-1]+a[i], a[i])
, 2 ≤ i ≤ n 2\leq i \leq n 2≤i≤n。 - 搞一个变量b:
sum = max(b>0?b+a[i]:a[i], sum)
。
实现1
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
// n个数,a数组
int DPMaximumSubarray(int n, int *a)
{
// 初始化了n个默认值为0的元素
vector<int> b(n);
// b[0]
b[0] = a[0];
// sum表示最大的和(全局最优),b表示局部最优
int sum = 0;
// 遍历a数组
for (int i = 1; i < n; i++)
{
int t = b[i - 1] + a[i];
if (t > a[i])
{
b[i] = t;
}
else
{
b[i] = a[i];
}
}
for (int i = 0; i < n; i++)
{
sum = sum > b[i] ? sum : b[i];
}
return sum;
}
int main(void)
{
int a[] = {-2, 11, -4, 13, -5, -2};
int n = sizeof(a) / sizeof(a[0]);
cout << DPMaximumSubarray(n, a);
return 0;
}
// 20
实现2
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
// n个数,a数组
int DPMaximumSubarray(int n, int *a)
{
// sum表示最大的和(全局最优),b表示局部最优
int sum = 0, b = 0;
// 遍历a数组
for (int i = 0; i < n; i++)
{
// sum = max(b>0?b+a[i]:a[i],sum)
// 大于0就是前者
if (b > 0)
{
b += a[i];
}
// 小于等于0后者
else
{
b = a[i];
}
// 更新
if (b > sum)
{
sum = b;
}
}
return sum;
}
int main(void)
{
int a[] = {-2, 11, -4, 13, -5, -2};
int n = sizeof(a) / sizeof(a[0]);
cout << DPMaximumSubarray(n, a);
return 0;
}