动态规划--打家劫舍-零钱兑换-算法刷题01

目录
  • 1. 概念
  • 2. 打家劫舍
  • 3 零钱兑换

1. 概念

关于动态规划这类问题 强烈建议学完下面的帖子:
https://blog.csdn.net/qq_16664581/article/details/89598243

理解动态规划的使用场景强烈建议读一下这个故事:
https://www.cnblogs.com/sdjl/articles/1274312.html

步骤:

  1. 确定问题 (可能是求某个问题的最优解 例如:背包问题中 装的物品价值最大,货币兑换问题,使用的币数量最少,或者是后一步的结果依赖前一步 的这类问题)
  2. 问题分解为子问题(背包问题里面第i个物品 可以选择那与不拿, 货币兑换问题,最大面值的零钱 使用与不使用)
  3. 写出状态转移方程
    f(n) = f(n-1) + f(n-1)
    f(n) = best_of[f(n-1) , f(n-1))]
  4. 确定边界

2. 打家劫舍

链接:https://leetcode.cn/problems/house-robber/description/

假设v(i)表示打劫 0–i能够获得的最大赃款

当你来到房间i时,你有两个选择:

  • 偷i,然后计算从前面i-2间里偷出的最大值,因为i-1不能再偷了。偷完把v(i)加到总赃款中。
  • 不偷i,这样你可以自由地选择前面的i-1间来使得赃款最大化。因为没偷,就不能往总赃款里加值。

实现1:

from typing import List
class Solution:def rob(self, nums: List[int]) -> int:def dp(i):if i == 0: return 0if i == 1: return nums[0]val = max(dp(i - 2) + nums[i - 1], dp(i - 1))return valreturn dp(len(nums))if __name__ == '__main__':nums = [2, 7, 9, 3, 1]s = Solution()res = s.rob(nums)print(res)

实现2--加入缓存

from typing import Listclass Solution:def rob(self, nums: List[int]) -> int:cache = {}def dp(i):if i == 0: return 0if i == 1: return nums[0]if i in cache: return cache[i]val = max(dp(i - 2) + nums[i - 1], dp(i - 1))cache[i] = valreturn valreturn dp(len(nums))if __name__ == '__main__':nums = [2, 7, 9, 3, 1]s = Solution()res = s.rob(nums)print(res)

实现3--递归公式

from typing import Listclass Solution:def rob(self, nums: List[int]) -> int:a = b = 0for v in nums:a, b = b, max(a+v, b)  # b赋值给a new_b赋值给breturn bif __name__ == '__main__':nums = [2, 7, 9, 3, 1]s = Solution()res = s.rob(nums)print(res)

3 零钱兑换

链接:https://leetcode.cn/problems/coin-change/description/

coins 已经从小到大排好序
定义: f(i, t)
i:面值的子集
t: 目标金额
使用面值子集i 来构成目标金额 t 所使用的硬币最小数量
面值子集i: coins[0], coins[1], … coins[i], i之后不考虑

原问题转化成: f(n-1, amount)

地推公式:

说明:
正常情况下 f(i, t)的计算是分成两支 一支向上走 一只支向下走 取这两者的较小值
假设面值集合i 里面的最大值 val=coins[i]
向上走 代表继续使用最大面值 转化成 f(i, t-val) + 1, 之所以要+1 是因为使用了一次 最大面值,特殊情况:
当t<val的时候 代表最大面值已经超过了t 无法拼出t 这是返回一个无穷大,可以将该分支剪掉, 因为min的运算 取更小值 值为无穷大的 肯定会被抛弃掉
当t=val 代表只能用一个最大面值 拼成 目标值t
其他情况 返回f(i, t-val) + 1
向右走 代表不再使用最大面值 正常情况为f(i-1, t)
当 i==0 已经不能再往右走 返回无穷大 舍弃掉该分支即可

from typing import Listclass Solution:def coinChange(self, coins: List[int], amount: int) -> int:# 异常处理if not amount:return 0mini_coin_exist = Falsefor co in coins:if co <= amount:mini_coin_exist = Trueif not mini_coin_exist:return -1if len(coins) == 1 and amount % coins[0] != 0:return -1# 核心逻辑n = len(coins)cache = {}def _dp(i, t):if (i, t) in cache:return cache[(i, t)]val = coins[i]# 使用valif t < val:use_val = float('inf')elif t == val:use_val = 1else:use_val = _dp(i, t - val) + 1# 不使用valno_val = float('inf') if i == 0 else _dp(i - 1, t)res = min(use_val, no_val)cache[(i, t)] = resreturn resresult = _dp(n - 1, amount)# 没有方案的情况if result == float("inf"):return -1return resultif __name__ == '__main__':# coins = [1, 2147483647]# amount = 2coins = [384, 324, 196, 481]amount = 285s = Solution()res = s.coinChange(coins, amount)print(res)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/738909.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一天快速入门Django:从0到1创建属于自己的Web应用

本文详细讲解了从零开始构建自己的 Web 应用所需的 Django 操作步骤。文章以简明易懂的方式引导读者设置开发环境,创建 Django 项目和应用,定义数据模型,编写视图函数和模板,以及配置 URL 路由。强调了 Django 框架的高效性和灵活性,特别是其基于 MTV(模型、模板、视图)…

羽云十六进制编辑器之插件开发文档

羽云十六进制编辑器的开发文档首页【占位】本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可本文来自博客园,作者:寂静的羽夏 ,一个热爱计算机技术的菜鸟转载请注明原文链接:https://www.cnblogs.com/wingsummer/p/18286419

Mybatis PageHelper编译SQL引发的一次性能问题.18286262

起源 最近一直在跟大佬们做公司项目的性能优化,我这种小卡乐咪基本上负责的就是慢接口优化,但实际上只有以下几种情况需要进行接口代码级别的改造:循环查库、RPC 数据库设计不合理 业务流程太长,代码耦合性太高等随着对接口分析的深入,我们越来越发现系统中有很多拖后腿的…

蓝牙音箱App设计总结

前言 最近做了一个关于带Sound bar的智能电视的蓝牙项目,就是将电视Sound bar当作蓝牙音箱,将手机、电脑等设备的声音传输到电视,通过电视Soundbar播放声音。做这个项目的时候遇到了各种大大小小的问题,好在都解决了。本篇文章总结了在设计蓝牙相关的项目时需要了解的小知识…

设计模式学习(二)工厂模式——抽象工厂模式

介绍抽象工厂模式,并说明其优缺点目录背景抽象工厂模式优点与缺点 背景 现在我需要开发一个相机操作模块,它可能在Windows下运行,也可能在Linux下运行。由于在厂家提供的SDK中,Windows下的SDK和Linux下的SDK是有区别的,因此我们要创建两个类去封装这两个不同平台下的API。…

aippt 实现原理 AI生成PPT开源项目

AI生成PPT原理与代码实现通过 AI 生成 PPT 火了好长一段时间了,该类型产品也越来越多,我分析了几个主流的 aippt 产品,其中有一家公司的技术原理让我眼前一亮:文多多 AI 生成 PPT,官网: https://docmee.cn 该产品在 github 上有对应开源项目:https://github.com/veasion…

自定义流程表单开发优势体现在什么地方?

一起来了解自自定义流程表单开发的优势特点。提质、增效、降本,应该是很多职场办公需要实现的发展目标。那么,应用什么样的软件平台可以实现?低代码技术平台、自定义流程表单开发是目前流行于职场行业中的软件产品,可视化操作界面、够灵活、易维护等优势特点明显,在推进企…

Matlab马尔可夫链蒙特卡罗法(MCMC)估计随机波动率(SV,Stochastic Volatility) 模型|附代码数据

全文下载链接:http://tecdat.cn/?p=16708 最近我们被客户要求撰写关于随机波动率的研究报告,包括一些图形和统计输出。 波动率是一个重要的概念,在金融和交易中有许多应用。它是期权定价的基础。波动率还可以让您确定资产配置并计算投资组合的风险价值 (VaR) 甚至波动率本身…

2024.7.5 鲜花

菜就多练空白とカタルシス——TOGENASHI TOGEARI。震惊,K某He 强推竟然是这首歌,三天重复上百遍…… どれだけ手に入れても どれだけ自分のものにしてもしてもしても 追いつけないな 高望みしすぎなんて 腐ったような言葉 誰しも誰よりも優れて欲しくはないんだよ 理由はただ…

泛娱乐出海新风口,视频云技术需要怎样的融合创新?

泛娱乐的音视频技术随着出海在演进,交互和内容的技术是内核,也在融合。 泛娱乐的音视频技术随着出海在演进,交互和内容的技术是内核,也在融合。 面向出海,虽然娱乐社交这个行业由来已久,但近几年的商业模式发生了巨大变化,比如行业刚兴起时,大家要先把DAU做大之后再…

米尔瑞米派集聚5种操作系统,兼顾学习开发和项目产品需要的派

米尔电子发布的瑞萨第一款MPU生态板卡-瑞米派(Remi Pi),采用瑞萨RZ/G2L双核A55芯片,接口丰富,全面兼容树莓派的扩展模块。瑞米派支持五种系统,兼顾学习开发和项目产品需要。软件提供五种软件系统分别为:基于Yocto构建的两种系统,一种是支持通用功能的精简型系统,另一种…

echarts中Label标签与数据项颜色设置为同一种颜色

echarts5中默认标签颜色不会跟数据项颜色保持一致,而是全都是黑色。想要实现label颜色和它的数据项颜色一致,需要手动继承颜色,设置label{ color: inherit}即可解决label标签颜色与数据项颜色一致。 https://echarts.apache.org/examples/zh/editor.html?c=pie-simple 注意…