先看题目:
a[n]这个数组中,找到连续的一段数且保证这些数的和是最大的
举个例子
0 6 -1 1 -7 7 -5
result = 7
正常情况下你可以这么做
sum = 0;
sum = 6;
sum = 5;
sum = 6;
sum = -1;
sum = 6;
sum = 1;
这样你只需要加一个max,每一次加好之后和max进行比较就可以。
但是,你这样不断记录,比较,得出来的最终结果也只能是从0开始的连续的和最大的一段,你又如何才能获取最优的答案?
所以这里就需要我们动态规划的思想了,求最优。
你sum到了-1的时候,前面的东西直接舍弃就可以了,你如果给后面的是负数,那后面的数还不如不要你?
所以说就是利用了一个给后面的数提供最优的思想,解决了这个题目。
所以我举个例子。
0
0
6
0
6 -1
0
6 -1 1
0
6 -1 1 -7
0
6 -1 1 -7 7
0
6 -1 1 -7 7 -5
你需要求解包含1位的最优解,
包含1到2位的最优解,
包含1到3位的最优解,
包含。。1到7位的最优解。
求这么多,为什么不直接求1到7位的最优解?
试问,直接求求得出来吗?那不是和我们本题一样了吗?
因为每一位的最优解都是建立在前面的基础之上的。
而且,你求最优解的时候,还必须包括你当前的最后一位数。
为什么?不是求最优解吗?
那你可以再试试求最后一个序列,如果你不打算包括你的最后一位数,那不是和我们本题要求一样了吗?
所以我们求的最优解,并非是真的最优解,是结束位在不同位上的最优解,开始为就可以随意定了。
只是求出这些结束位在不同位上的最优解的每一种情况,进行一个记录筛选罢了。
看看是不是很巧妙,最后一位的所有可能都给你列出来了,而第一位又是你可以求出来的,就涵盖了所有的情况。
其次,上一个最优解和下一个最优解之间又有着密切的关系。
这就是动态规划。是通过一种求伪最优解的方式,层与层之间又有联系,巧妙地得出了本来难以得出的答案。