动态规划算法(DP)

动态规划算法(DP)nbsp nbsp 校招笔试面试前 大家一般都会先去牛客网上刷刷题 剑指 offer leetcode 走起来 然后初次入手 发现很多不会 不会到什么程度呢 连个想法都没有 于是就去讨论区看答案 然后 java 大神 c 大神会给出花式解答 他们喜欢在答案前加一句 简单的 dp 算法 递归就可以解决 巴拉巴拉 说的还是很详细的 然而代码并不能看懂 毕竟 nbsp nbsp 人生苦短 我用 python 下面就先给大家举一些详细的

    校招笔试面试前,大家一般都会先去牛客网上刷刷题,《剑指offer》,《leetcode》走起来,然后初次入手,发现很多不会,不会到什么程度呢,连个想法都没有,于是就去讨论区看答案,然后java大神,c++大神会给出花式解答,他们喜欢在答案前加一句,简单的dp算法,递归就可以解决,巴拉巴拉。说的还是很详细的,然而代码并不能看懂,毕竟

    人生苦短,我用python

下面就先给大家举一些详细的例子来说说如何解决动态规划问题

    首先,你要知道什么才能算动态规划问题,这里,推荐《算法图解》这本书,是基于python写的一本算法讲解书,内容非常简单,没未接触过算法的人也能看懂,我先直接引用这里的讲法:

动态规划算法(DP)

动态规划算法(DP)

动态规划算法(DP)

动态规划算法(DP)

动态规划算法(DP)

动态规划算法(DP)

动态规划算法(DP)动态规划算法(DP)

动态规划算法(DP)

动态规划算法(DP)

动态规划算法(DP)

动态规划算法(DP)

动态规划就是要将问题细分为小问题,然后再着手解决这些小问题。

例1:(题目来源于牛客网)

题目描述

给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N员(N为0-10000的非负整数)的不同组合的个数。

输入描述:

输入为一个数字N,即需要拼凑的面额

输出描述:

输出也是一个数字,为组成N的组合个数。

这可以视为一个动态回归问题解决,首先我们可以画一个dp表格

dp表的列数字表示要拼成的面额,行表示可以用哪几种面额的拼,比如说dp的一元行,5元列表示只用一元钱拼成5元钱只有一种方法,dp1元,5元行、6元列表示用币值1元和5元拼成6元的方法有两种,明显dp[1,:]=1,而若j>i,dp[i,j]=dp[i-1,j]+dp[i,j-i],例如dp[2,10]=dp[1,10]+dp[2,5], 这个表达式说明,用1元和5元的面额拼成10元的方法数=用1元拼成10元的方法数+用1元和5元拼成5元的方法数,因为面额6-9元拼成方法都是一样的,暂时没有更小的面额可供选择,这个公式便是这个算法的核心

dp表格
  0 1 2 3 4 5 6 7 8 9 10
1元 1 1 1 1 1 1 1 1 1 1 1
1元,5元 1 1 1 1 1 2 2 2 2 2 3
1,元,5元,10元 1 1 1 1 1 2 2 2 2 2 4
1,5,10,20元                      
,1,5,10,20,50元                      
,1,5,10,20,50,100元                      

代码如下

money=[1,5,10,20,50,100] n = int(input()) li=[] for i in range(n+1): li.append(0) li[0]=1 for i in money: for j in range(n+1): if j>=i: li[j]=li[j]+li[j-i] print(li)

例2 来源于《剑指offer》

题目描述

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)

简单来说就是求一个最大子串问题,也是一个典型的动态规划问题

思路:设F(i)是以array[i]为结束点的最大子向量(从0开始),比如说F(3)就是最后一个向量是7的最大子串,可知

          F(i) = max(F(i-1)+array[i],array[i])

          设res是所有字串中最大的那个,也就是我们最后要求的值

          res  = max(res,F(i))

代码:

def FindGreatestSumOfSubArray(array): f = array[0] res = array[0] for i in range(1,len(array)): f = max(f+array[i],array[i]) res = max(res,f) return res

这样便求得最后的解,不懂的话可以自己手写一下循环,多悟几次,日后使用起来就很方便啦


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222746.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:04
下一篇 2026年3月17日 下午3:04


相关推荐

  • linux下Mysql的简单操作

    linux下Mysql的简单操作linux下Mysql的简单操作

    2022年4月22日
    57
  • validates_email

    validates_email

    2021年8月27日
    71
  • java 中级面试题及答案「建议收藏」

    java 中级面试题及答案「建议收藏」java中级面试题及答案1.MyBatis中,根据Id查询单个Order对象,动态SQL如何编写?A.SELECT*FROMOrderWHEREID=#{id};B.SELECT*FROMOrderWHEREID=#{id};C.SELECT*FROMOrderWHEREID=#{id};D.SELECT*FROMOrderWHEREID=#{id};B2.当一个bean的作用域为Prototype,表示含义是什

    2022年6月16日
    28
  • linux重启网卡命令_linux重启网卡命令有哪些

    linux重启网卡命令_linux重启网卡命令有哪些在linux下改了ip地址后,不能立即生效。以前是重启机器,我觉得这样很傻,后来知道网卡可以重启。/etc/init.d/networkrestart

    2026年2月16日
    4
  • Sublime Text 3 全程详细图文教程(转载)

    Sublime Text 3 全程详细图文教程(转载)今天被群里大佬安利了一款文本编辑软件,找了一下相关教程。一、 前言使用SublimeText也有几个年头了,版本也从2升级到3了,但犹如寒天饮冰水,冷暖尽自知。最初也是不知道从何下手

    2022年7月4日
    22
  • 批处理注释

    批处理注释echo 表示显示此命令后的字符 echooff 表示在此语句后所有运行的命令都不显示命令行本身 与 echooff 相象 但它是加在每个命令行的最前面 表示运行时不显示这一行的命令行 只能影响当前行 call 调用另一个批处理文件 如果不用 call 而直接调用别的批处理文件 那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令 pause 运行此句会暂停批处理的执行并在屏

    2026年3月20日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号