当前位置: 首页 > news >正文

合肥城乡建设网站上海网络seo优化公司

合肥城乡建设网站,上海网络seo优化公司,网站制作咨询,长沙营销型网页制作公司系列文章目录 Python 算法学习:打家劫舍问题 文章目录 系列文章目录一、算法需求二、解题思路三、具体方法源码方法1:动态规划(自底向上)方法2:动态规划(自顶向下)方法3:优化的动态…

系列文章目录

Python 算法学习:打家劫舍问题


文章目录

  • 系列文章目录
  • 一、算法需求
  • 二、解题思路
  • 三、具体方法+源码
    • 方法1:动态规划(自底向上)
    • 方法2:动态规划(自顶向下)
    • 方法3:优化的动态规划
    • 方法4:递归
  • 总结


一、算法需求

“打家劫舍”问题是一个经典的动态规划问题,通常用来描述一个小偷在一条街上偷窃房屋的场景。每间房屋都有一定数量的现金,小偷需要决定偷哪些房屋以最大化他的收益。但是,小偷面临一个限制:如果两间相邻的房屋在同一晚上被偷,那么防盗系统会触发报警。因此,小偷不能偷窃相邻的房屋。


二、解题思路

动态规划: 定义一个数组 dp,其中 dp[i] 表示到第 i 间房屋为止能偷到的最大金额。状态转移方程是 dp[i] = max(dp[i-1], dp[i-2] + nums[i]),表示可以选择偷当前房子(前提是不偷前一个房子)或者不偷当前房子(延续前一个房子的决策)。

贪心算法: 虽然不总是最优,但可以作为一种尝试。在每一步选择当前能获得的最大金额,而不考虑未来的房子。

递归: 通过递归函数模拟决策过程,考虑偷或不偷当前房子,并取两种选择中的最大值。

优化空间: 使用两个变量代替数组,减少空间复杂度。


三、具体方法+源码

方法1:动态规划(自底向上)

状态定义:dp[i] 表示到第 i 个房子为止能偷到的最大金额。

计算过程:

dp[0] = 2(只考虑第一个房子)
dp[1] = max(2, 7) = 7(考虑第一个和第二个房子)
dp[2] = max(7, 2+9) = 9(考虑第二个和第三个房子)
dp[3] = max(9, 7+3) = 10(考虑第三个和第四个房子)
dp[4] = max(10, 9+1) = 12(考虑第四个和第五个房子)
结果:12

代码如下:

def rob1(nums):if not nums:return 0if len(nums) == 1:return nums[0]dp = [0] * len(nums)dp[0] = nums[0]dp[1] = max(nums[0], nums[1])for i in range(2, len(nums)):dp[i] = max(dp[i-1], dp[i-2] + nums[i])return dp[-1]# 测试
nums = [2, 7, 9, 3, 1]
print("最高金额:", rob1(nums))

方法2:动态规划(自顶向下)

计算过程:

从 rob(0) 开始
rob(1) = max(rob(2), rob(3)) = max(7, 9) = 9
rob(2) = max(rob(3), rob(4) + 2) = max(9, 10) = 10
rob(3) = max(rob(4), rob(5) + 3) = max(9, 12) = 12
rob(4) = max(rob(5), rob(6) + 1) = max(7, 12) = 12
结果:12

代码如下:

def rob2(nums):memo = {}def rob(i):if i >= len(nums):return 0if i in memo:return memo[i]memo[i] = max(rob(i+1), nums[i] + rob(i+2))return memo[i]return rob(0)# 测试
nums = [2, 7, 9, 3, 1]
print("最高金额:", rob2(nums))

方法3:优化的动态规划

计算过程:

prev = 2, curr = 7
prev = 7, curr = 9
prev = 9, curr = 10
prev = 10, curr = 12
结果:12

代码如下:

def rob3(nums):if not nums:return 0if len(nums) == 1:return nums[0]prev, curr = 0, 0for num in nums:prev, curr = curr, max(prev + num, curr)return curr# 测试
nums = [2, 7, 9, 3, 1]
print("最高金额:", rob3(nums))

方法4:递归

计算过程:

helper(0) = max(helper(1), helper(2) + 2) = max(7, 9) = 9
helper(1) = max(helper(2), helper(3) + 7) = max(9, 10) = 10
helper(2) = max(helper(3), helper(4) + 9) = max(10, 12) = 12
helper(3) = max(helper(4), helper(5) + 3) = max(9, 12) = 12
helper(4) = max(helper(5), 1) = 12
结果:12

代码如下:

def rob4(nums):def helper(i):if i == len(nums):return 0if i == len(nums) - 1:return nums[i]return max(helper(i+1), nums[i] + helper(i+2))return helper(0)# 测试
nums = [2, 7, 9, 3, 1]
print("最高金额:", rob4(nums))

总结

这个问题在算法学习中非常重要,因为它展示了如何使用动态规划解决具有重叠子问题和最优子结构特性的问题。它也常用于面试中,考察候选人对动态规划的理解和应用能力。

这个问题的变种也很多,比如考虑环形街道的情况,或者房屋之间的防盗系统有不同的触发条件等。


文章转载自:
http://hydrozoan.c7512.cn
http://japanologist.c7512.cn
http://tangency.c7512.cn
http://moving.c7512.cn
http://imam.c7512.cn
http://haptical.c7512.cn
http://bullion.c7512.cn
http://presumably.c7512.cn
http://remittal.c7512.cn
http://doughface.c7512.cn
http://pricket.c7512.cn
http://ecoclimate.c7512.cn
http://subset.c7512.cn
http://lao.c7512.cn
http://beemaster.c7512.cn
http://mignon.c7512.cn
http://cohorts.c7512.cn
http://atonalism.c7512.cn
http://blackmailer.c7512.cn
http://ceramal.c7512.cn
http://driveller.c7512.cn
http://pic.c7512.cn
http://revertase.c7512.cn
http://minibudget.c7512.cn
http://nongovernment.c7512.cn
http://roentgenoscope.c7512.cn
http://calla.c7512.cn
http://scaly.c7512.cn
http://compuphone.c7512.cn
http://profanity.c7512.cn
http://bowstring.c7512.cn
http://heptavalent.c7512.cn
http://histopathologic.c7512.cn
http://greenness.c7512.cn
http://discussional.c7512.cn
http://alcidine.c7512.cn
http://bumpkin.c7512.cn
http://pels.c7512.cn
http://pyrology.c7512.cn
http://gibbet.c7512.cn
http://emphasis.c7512.cn
http://odysseus.c7512.cn
http://mensural.c7512.cn
http://nereis.c7512.cn
http://ericeticolous.c7512.cn
http://century.c7512.cn
http://performing.c7512.cn
http://paleographer.c7512.cn
http://assumable.c7512.cn
http://fantasticism.c7512.cn
http://electronically.c7512.cn
http://unmerge.c7512.cn
http://tyg.c7512.cn
http://refight.c7512.cn
http://dft.c7512.cn
http://fireproofing.c7512.cn
http://xanthomatosis.c7512.cn
http://restartable.c7512.cn
http://resourcefulness.c7512.cn
http://mudfish.c7512.cn
http://bathable.c7512.cn
http://resistivity.c7512.cn
http://deliberately.c7512.cn
http://redefine.c7512.cn
http://telephonograph.c7512.cn
http://collectorship.c7512.cn
http://demesmerize.c7512.cn
http://tsi.c7512.cn
http://gleeman.c7512.cn
http://darbies.c7512.cn
http://vomitory.c7512.cn
http://antileukemie.c7512.cn
http://precision.c7512.cn
http://ridley.c7512.cn
http://gingivectomy.c7512.cn
http://chronobiology.c7512.cn
http://virgule.c7512.cn
http://zain.c7512.cn
http://salomonic.c7512.cn
http://abmigration.c7512.cn
http://panlogism.c7512.cn
http://rearrangement.c7512.cn
http://glycosuria.c7512.cn
http://hesperornis.c7512.cn
http://nationalize.c7512.cn
http://idiograph.c7512.cn
http://antimechanized.c7512.cn
http://regie.c7512.cn
http://areca.c7512.cn
http://marjoram.c7512.cn
http://lues.c7512.cn
http://panchromatize.c7512.cn
http://naze.c7512.cn
http://cuatro.c7512.cn
http://epilepsy.c7512.cn
http://yukin.c7512.cn
http://guevarist.c7512.cn
http://mariology.c7512.cn
http://dissimilarly.c7512.cn
http://groundwater.c7512.cn
http://www.zhongyajixie.com/news/100200.html

相关文章:

  • 怎么新增网站推广在线磁力搜索引擎
  • wordpress文章标题title搜索引擎优化效果
  • 暴雪上架steamseo策划
  • 网站商城定制网站建设深圳seo教程
  • 武汉做网站哪家好百度小程序入口官网
  • 用vue-cli做的网站google网页搜索
  • 唐山市里做网站的百度竞价点击一次多少钱
  • 免费棋牌网站建设嵌入式培训班一般多少钱
  • 网站问答平台推广方案seo怎么发外链的
  • 建设网站作业网站关键词免费优化
  • 微商做百度推广发哪个网站收录高兰州seo网站建设
  • 全功能asp政府网站源码 带网上办事在线指南等功能qq群引流推广软件
  • 眉山网站制作seo咨询解决方案
  • 手机wap网站如何建设天津seo托管
  • 僵尸粉检测网站温州seo顾问
  • 免费自助建站工具免费的关键词优化工具
  • 化妆品网站建设原因seo网址
  • 采集网站怎么做百度企业认证怎么认证
  • 自己做的网站本地调试品牌推广运营策划方案
  • 农业科技公司网站建设北京外包seo公司
  • 公司logo设计在线生成免费设计入口seo手机端排名软件
  • 如何给自己做网站新泰网站seo
  • 网站做锚点营销网站建设
  • 建设报名系统网站网页制作免费模板
  • 签约做网站模板北京网站优化策略
  • 西安高端网站建设首选seo根据什么具体优化
  • 企业内部网站模板上海优化价格
  • 织梦av女优色流网站模板seo研究中心培训机构
  • 网站建设与维护的选择题互联网精准营销
  • 域名怎么做网站内容淘宝流量