引入
该部分举例来源于中国大学MOOC:浙江大学《数据结构》
在解决一些最优解问题时,我们经常会需要进行动态规划的求解,以期望避免暴力搜索消耗的超长时间.
我们先来看一个最简单的例子.
现有一个每个值都已经确定的数列an,定义子数列为从这个数列中抽取的任意1~n个元素,按相对顺序不变的条件组成的一个新数列.
例如,对于数列(9,8,3,9,2,6),其一个子列可以是(9),(3),(9,8,6),(9,8,3,9,2),等等. 而(3,8)不属于其子列.
现在,求一个由an中任意个连续元素构成的子列的最大和.
输入:输入包含两行,第一行是一个整数,表示数列的长度n.第二行是n个数,表示这个数列的各个值.
输出:输出包含一个数,表示其最大的一个连续子列的和.
测试用例保证1≤n≤100000(105).
时间限制:1000ms
输入样例
8
1 4 -1 -5 8 0 3 1
输出样例
12
解释:从数列中抽取8,0,3,1这四个连续元素构成的子列有最大和12.
如何求解?首先想到暴力搜索:遍历求出所有子列的和,找到最大值.
C/C++代码如下:
#define MAXN 100001
int a[MAXN];
int main()
{
int n = 0;
scanf("%d", &n);
int ans = 0;//存最终答案
for(int i = 0; i < n; ++i) scanf("%d", &a[i]);//输入数列
for(int len = 1; len <= n; ++len)//按数列的长度遍历.
{
for(int i = 0; i + len - 1 < n; ++i)//求出所有长度
{
//为len的子列的和.
int sum = 0;
for(int j = i; j <= len + i - 1; ++j)
sum += a[j