emmm,原本的廣搜鴿掉了,本來是有安排的,但是linqi他一直要我發和我聊天,所以,鴿掉了。其實是我自己不想寫
好了好了,看到標題了吧,欸錯,這篇是關於動態規劃的
動態規劃
感覺繁體有點奇怪先換成簡體
哈喽哈喽 好多了
动态规划,是求最优解的一种途径,一种方法,而不是一种特殊算法,所以它并没有明确的解题方法
比较常见的例题像是
- 如何安排haoran的时间,让他一天(12小时)赚到最多的钱
- 如何实现人力用的最少干完所有活
比如这一道最大子段和
题目描述
给出一段序列,选出其中连续且非空的一段使得这段和最大。
输入格式:
第一行是一个正整数NN,表示了序列的长度。
第二行包含NN个绝对值不大于1000010000的整数A_iA
输出格式:
一个整数,为最大的子段和是多少。子段的最小长度为11
我们会先想到贪心对吧(这道题好像可以用贪心做)但是,我们不能老想着一招吃遍天下鲜吧,贪心对于某些问题是解不了的,下次补充。
那我们打表,暴力枚举可以吗(这道题好像还是可以)但是,它的时间复杂度为O(n^2),所以如果换了一个数据非常大的题目呢,肯定超时呀,所以也不是万能的
别忘了标题写着什么,没错,这道题就是要用动态规划,将求n个数的数组的最大子段和,我们可以从第一个找到第n个,分别记录每个数字结尾的最大字段和,在进行比较,输出最大的。
代码懒得打,所以从一位大佬那里找了一份,大佬传送门
此题传送门
代码如下:
def Solution(nums):
if len(nums) == 0:
return 0
if len(nums) == 1:
return nums[0]
dp = []
dp.append(nums[0])
dp.append(max(nums[0],nums[1]))
for i in range(2,len(nums)):
dp.append(max(dp[i-1],dp[i-2]+nums[i]))
return dp[len(nums)-1]
print(Solution([0,0]))
最后,总结一下解题方法:
- 先读题,确定此题运用动态规划解决
- 分解大问题为子问题,找不相同的地方作为参数
- 实施方案解决子问题
- 感觉有点简略,多写一行凑数
好吧今天就这样了,明天附上补充