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

[Java恶补day60] 整理模板·考点十三【动态规划】

【问题描述】

【思考步骤】⭐
step1· 构造回溯
①入参、返回值
②递归到哪里
③递归边界、递归入口
step2· 改为记忆化搜索
step3· 1:1翻译为递推


198. 打家劫舍【模板题】

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额

示例 1:
输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:
输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:
1 <= nums.length <= 100
0 <= nums[i] <= 400


知识点:
数组、动态规划


【步骤1:回溯】

  1. 当前操作?枚举第iii个房子选/不选
  2. 子问题?从前iii个房子中得到的最大金额和
  3. 下一个子问题?
    a. 不选:从前i−1i-1i1个房子中得到的最大金额和
    b. 选:从前i−2i-2i2个房子中得到的最大金额和
  4. 状态转移方差:dfs[i]=max(dfs[i−1],dfs[i−2]+nums[i])dfs[i] = max(dfs[i-1], dfs[i-2]+nums[i])dfs[i]=max(dfs[i1],dfs[i2]+nums[i]),表示从nums[0]nums[0]nums[0]nums[i]nums[i]nums[i]最多能偷多少

【步骤2:记忆化搜索】
6. 记忆化搜索 = 递归搜索 + 保存计算结果
7. 记忆化搜索:自顶向下计算
8. 保存计算结果:把递归的计算结果保存下来,下次递归到相同入参时,就直接返回之前保存的结果

【步骤3:递推】
9. 递推 = 自底向上计算
10. 翻译为递推的方法:
a. dfs → f数组
b. 递归 → 循环
c. 递归边界 → 数组初始值

代码(记忆化搜索):
时间复杂度:O(n)O(n)O(n)
空间复杂度:O(n)O(n)O(n)

class Solution {public int rob(int[] nums) {// 初始化数组,元素均为-1,记录已计算过的int n = nums.length;int[] memo = new int[n];Arrays.fill(memo, -1);//从最后一个房子开始搜索return dfs(n - 1, nums, memo);}// dfs[i] = 从nums[0]到nums[i]最多能偷多少private int dfs(int i, int[] nums, int[] memo) {//递归边界if (i < 0) {return 0;}//若之前计算过if (memo[i] != -1) {return memo[i];}//记忆化,并返回答案int notChoose = dfs(i - 1, nums, memo);int choose = dfs(i - 2, nums, memo) + nums[i];memo[i] = Math.max(notChoose, choose);return memo[i];}
}

代码(递推):
时间复杂度:O(n)O(n)O(n)
空间复杂度:O(n)O(n)O(n)

class Solution {public int rob(int[] nums) {int n = nums.length;int[] f = new int[n + 2]; //不让下标为负数//递归→循环for (int i = 0; i < n; i++) {f[i + 2] = Math.max(f[i + 1], f[i] + nums[i]);}//从最后一个房子开始搜索return f[n + 1];}
}

代码(空间优化):
时间复杂度:O(n)O(n)O(n)
空间复杂度:O(1)O(1)O(1)

class Solution {public int rob(int[] nums) {int f0 = 0;int f1 = 0;for (int x : nums) {int newF = Math.max(f1, f0 + x);f0 = f1;f1 = newF;}return f1;}
}

参考:
1、灵神题解



知识点:


解:

时间复杂度:O()O()O()
空间复杂度:O()O()O()



参考:
1、灵神题解



知识点:


解:

时间复杂度:O()O()O()
空间复杂度:O()O()O()



参考:
1、灵神题解

http://www.dtcms.com/a/415909.html

相关文章:

  • XCOSnTh软件是如何结合到硬件上的?
  • Vala编程语言高级特性- 断言和契约编程
  • 在哪建设网站wordpress 语言
  • 秦皇岛网站建设价格郑州关键词优化平台
  • 贵阳公司做网站常州建站程序
  • RabbitMQ安装(基于宝塔面板)与基础操作指南
  • 最早做视频播放网站wordpress 2011
  • 合肥做网站123cms工作室怎么注册
  • 中国外贸网站有哪些问题wordpress文件详解
  • Bean 生命周期 后置处理器
  • 医疗网站女性专题网页设计模板做设计有哪些接私活的网站
  • 如何做网站给女朋友旅游网站设计代码模板
  • 技术博客SEO优化全攻略
  • 3.十天通关常见算法100题(第三天)
  • 信阳哪里做网站网站平台建设
  • 网站海外推广方案室内设计联盟 官网
  • 网上做翻译兼职网站好电影介绍网页设计代码
  • Git 重新生成SSH密钥
  • 佛山公益网站制作wordpress logo 修改
  • 【大语言模型 75】训练稳定性保证:Loss spike检测与处理
  • 自然语言处理(02)
  • 手机制作网站主页软件博客网页制作代码
  • 单片机入门的相关工具XCOSnTh
  • 基于寄存器的STM32开发指南:使用Keil MDK创建工程模板
  • 有哪些做场景秀的网站网站优化销售话术
  • 高光谱成像在分析作物长势和产量预估中的应用
  • C++面向对象编程——封装
  • 优秀设计作品网站seo综合查询平台官网
  • 海城区建设局网站工会门户网站建设需求
  • 武汉市最新街景图像数据!