[这是算法]关于动态规划我的理解

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]))

最后,总结一下解题方法:

  1. 先读题,确定此题运用动态规划解决
  2. 分解大问题为子问题,找不相同的地方作为参数
  3. 实施方案解决子问题
  4. 感觉有点简略,多写一行凑数

好吧今天就这样了,明天附上补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值