1. 问题描述
现有一个整数序列 (), 长度为 , 求具有最大和的子串
2. 初次的归纳递推尝试
现有序列
假设:
已知长度小于 的序列所对应的最大子串和
即: 我们现在知道对于序列 对应的最大子串和, 可假设为
分条件讨论如下:
1. 保持不变 2. 加上之后, 原来不是最大的变成最大的了(此时得到的串一定是以 结尾的) |
可见, 在第三种情况的时候, 并不能得出明确的结论
3. 更强的假设
假设:
已知长度小于 的序列所对应的最大子串和和以 结尾的最大的子串
接着上表的第3种情况分析:
情况 | 备注 | |
---|---|---|
其中的第1点可以明确了 | ||
其中的第2点可以明确了 |
这里不再需要考虑 是否大于0了
4. 伪代码
global_max = 0
suffix_max = 0
for i in range(0, len(arr)):
if arr[i] + suffix_max > global_max:
suffix_max = suffix_max + arr[i]
global_max = suffix_max
elif arr[i] + suffix_max > 0:
suffix_max = suffix_max + arr[i] // 这里可以维持住suffix的最大这种情况
else: // arr[i] < 0 且很小
suffix_max = 0
5. 加强型归纳递推
一般的归纳递推:
加强型归纳递推:
在加强型的情况下其实隐含了
引入了 的代价就是你得维护这个 的状态迁移, 即 , 这个也必须是可证明或者是确定的
就如上面代码中的 suffix_max
这个变量的维护
ref:
- Introduction to algorithm a creative approach [udi manber]
- https://mathoverflow.net/questions/31699/strengthening-the-induction-hypothesis
网友评论