上大二的时候,参加学校的在线编程竞赛,刚开始遇到有关动态规划的问题。我看了看几个经典的动态规划问题,仍然不是很理解。请教一位ACM大牛,他说动态规划比起一种解题技术更多的是一种思考方法,需要锻炼才能掌握。过了一段时间,随着自己不断积累解决问题经验,再看动态规划有种豁然开朗的感觉。虽然没有经过正规的ACM锻炼,但也算懂得了一种解决问题的思路。
动态规划解决问题有两个步骤:首先将待求解的问题分解为若干个重叠子问题,然后再合并子问题的解以得出原问题的解。分解的阶段子问题应该是最优子结构,在合并的阶段子问题的最优解逐渐被计算并被保存,因为子问题的重复性就不需要重新解决这些子问题。我觉得理解动态规划的最好入门例子不外乎求最大子序列和求序列的最大上升序列这类问题。
仅列举求最大子序列的例子
问题描述:
给定有n个整数(可能为负整数)组成的序列a1,a2,...,an,求该序列连续的子段和的最大值。如果该序列的所有元素都是负整数时定义其最大子段和为0。例如,当(a1,a2,a3,a4,a5)=(-5,11,-4,13,-4-2)时,最大子段和为11+(-4)+13=20。
输入:
输入数据有T组测试数据。测试数据的数目 (T)在输入的第一行给出。每组测试数据有两行:第一行整数个数N,第二行为N个整数,每个整数之间用一空格隔开。
输出:
每个用例,用一行输出最大连续子段和。
样例输入:
1
6
-2 11 -4 13 -5 -2
样例输出:
20
python代码如下:
1 def max_str(n,numlist): 2 max_value=0 3 sum_str=0 4 for num in numlist: 5 if sum_str>0: 6 sum_str+=num 7 else : 8 sum_str=num 9 if sum_str>max_value: 10 max_value=sum_str 11 return max_value 12 13 if __name__ == '__main__': 14 array=[-5,11,-4,13,-4,-2] 15 n=len(array) 16 print max_str(n,array)