动态规划 复习 - 组成部分和步骤

简介


本文为复习动态规划的笔记,在UCLA CS180的笔记基础上增添了B站up主 七章算法的教学视频自学笔记内容
动态规划 - Dynamic Programming (DP)

DP 的定义是:

Consider a problem of size n

• Split the problem into smaller parts

​ 把问题拆分为多个子问题

• The solution of the original problem can be iteratively computed based on the solutions of subproblems

​ 在求解子问题的基础上,迭代求解原问题的解

DP的优点是:

  • Memorize the solution for solved subproblems

    记住已解决的子问题的解

  • Reuse the stored solution when encounter again

    再次使用存储的解决方案

也即是减少重复计算步骤,减少算法复杂度

OPT(i) : optimal solution with input size i(定义为当输入大小为i的最优解)

转换方程 Bellman Equation: O p t ( n ) = O p t ( n − 1 ) + O p t ( n − 2 ) Opt(n) = Opt(n-1) + Opt(n-2) Opt(n)=Opt(n1)+Opt(n2)

题目特点

下面图片来源于B站七章算法视频
在这里插入图片描述

题A用动态规划,动态规划一般就是给你最优解

题B用递归

计数型

  • 多少种方式走到右下角

求最大最小值 (最常见)- 最优解

  • 无数个途径 求最大数字和 。 最优策略

求存在性

  • 取石子游戏 判断是否存在胜利策略

  • 能不能选出k个数使和是Sum

动态规划组成部分:

  • 确定状态:

    • 最后一步
    • 化成子问题
  • 转移方程

  • 初始条件和边界情况

  • 计算顺序: 从小到大(原因:可以记录结果,不用重复计算)

例题

Coin Change 数硬币 - 求最值型动态规划

You are given an integer array coins representing coins of different denominations and an integer amount representing a total amount of money.

Return the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

You may assume that you have an infinite number of each kind of coin.

即用最少的硬币数组合去付款。

Example 1:

Input: coins = [1,2,5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1

Example 2:

Input: coins = [2], amount = 3
Output: -1

Example 3:

Input: coins = [1], amount = 0
Output: 0

Example 4:

Input: coins = [1], amount = 1
Output: 1

Example 5:

Input: coins = [1], amount = 2
Output: 2

思路

题型是多个组合求最大最小值,用动态规划解。

假设总计金额是amount = 50。 f ( 50 ) f(50) f(50) 就是这个问题的解,把这个问题拆分成子问题,使规模变小,求最优解。

不论哪个组合,都存在最后一步,即最后的一个硬币,它可以为任意值。

我们假设硬币有三种[1, 2, 5], 然后最少的硬币数设为k。即问题为 f ( 50 ) = k f(50)=k f(50)=k 枚。那么各组合中最后一枚$ a_k 必 定 为 这 三 者 的 其 中 之 一 。 那 么 , 剩 下 的 就 是 必定为这三者的其中之一。那么,剩下的就是 k-1$枚硬币需要我们求最优解。

也就是说,已经问题拆分为三个子问题了,再根据每个子问题继续递归拆分成三个子问题的子问题,便可得最优解。

拆分完成,接着是第二步**转移方程 **。(为了提高效率,减少递归解法中的重复计算)

把问题转为 f ( x ) = f(x) = f(x)=min{ f ( x − 1 ) + 1 , f ( x − 2 ) + 1 , f ( x − 5 ) + 1 {f(x-1)+1, f(x-2)+1,f(x-5)+1} f(x1)+1,f(x2)+1,f(x5)+1}, (+1是指最后一枚硬币),每一步都要计算三种方案。

第三步,初始条件和边界情况

初始条件: f ( 0 ) = 0 f(0) = 0 f(0)=0

边界情况:如果拼不出Y,则 Y = ∞ Y= \infin Y=

f(0)f(1)f(2)f(3)f(4)f(5)f(6)f(50)
011--01-----

总计50步,每一步尝试三种硬币方案。

第四步,计算顺序从小到大开始计算并记录之前的计算结果,那么后面的计算不需要重新计算之前的 f ( x ) f(x) f(x), 加快计算速度。

e.g. 换个例子说,5+2=7,如果要求5+2+7的话,因为我们已经知道5+2=7了,那么程序记录下来直接调用,计算就是 7+7=14, 不需要对5+2再进行重复的计算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 计算机组成原理是指计算机硬件系统的设计、构造、功能、工作原理和性能等方面的理论与方法。其中,计算机组成原理的核心是计算机的基本组成部分以及这些部分之间的工作原理。 计算机由五大基本部分组成:运算器、控制器、存储器、输入设备和输出设备。运算器是计算机的核心部件,主要用于执行各种运算。控制器用于控制计算机的各个部件,使其按照程序的要求工作。存储器用于存储程序和数据,是计算机的重要组成部分。输入设备用于向计算机输入数据和程序,输出设备用于将计算机处理后的结果输出给用户。 计算机组成原理的核心是将这些基本部件组合在一起,形成计算机的完整功能。其中,控制器和运算器的工作原理是计算机组成原理的重点之一。控制器主要负责解释和执行程序,将程序中的指令翻译成计算机可以理解的语言,并控制各个部件按照程序的要求工作。运算器则负责执行各种算术和逻辑运算。 除了基本组成部分之外,计算机组成原理还包括数据通路和控制信号等方面的内容。数据通路是计算机各个部件之间传递数据的通道,控制信号则是控制器向各个部件发送的控制信息。 总之,计算机组成原理是计算机科学中的基础课程之一,了解计算机组成原理可以帮助我们更好地理解计算机的工作原理,从而更好地设计和应用计算机。 ### 回答2: 复习计算机组成原理可以采取以下几个步骤: 1. 温习基础概念:计算机组成原理是计算机科学的基础课程,需要掌握一些基本概念,例如:计算机的运行原理、计算机的组成部分等。可以通过阅读教材或相关资料,并结合课堂笔记进行温习。 2. 着重理解关键知识点:计算机组成原理中有一些重要的知识点,如处理器的结构、存储器的层次结构、指令的编码和执行等。重点理解这些知识点的原理和运行机制,可以通过查阅各种教材、视频或参考书等多种资源进行学习。 3. 运用实践:理论与实践相结合是学习计算机组成原理的关键。通过实际操作,例如使用计算机模拟器或编写程序来实现一些基本的计算机组成原理的功能,能够帮助加深对知识的理解和记忆。 4. 解答习题和做练习:通过解答习题和做相关的练习,可以加深对知识的理解和掌握程度。可以找一些经典的习题和案例进行解答,也可以寻找一些练习题来检验自己的掌握情况。 5. 互助学习:与同学或其他学习者一起学习,互相交流和讨论,可以加深对知识的理解和记忆。可以分组或组建学习小组,共同讨论难点和问题,并相互帮助解决。 总的来说,复习计算机组成原理需要系统地温习基础知识、理解关键知识点、运用实践、解答习题和做练习,并与他人进行互助学习。通过这些方法的综合应用,可以更好地掌握计算机组成原理这门课程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值