【问题描述】[困难]

【解答思路】

1. 记忆化搜索



时间复杂度:O(n^3) 空间复杂度:O(n^2)

class Solution {public int[][] rec;public int[] val;public int maxCoins(int[] nums) {int n = nums.length;val = new int[n + 2];for (int i = 1; i <= n; i++) {val[i] = nums[i - 1];}val[0] = val[n + 1] = 1;rec = new int[n + 2][n + 2];for (int i = 0; i <= n + 1; i++) {Arrays.fill(rec[i], -1);}return solve(0, n + 1);}public int solve(int left, int right) {if (left >= right - 1) {return 0;}if (rec[left][right] != -1) {return rec[left][right];}for (int i = left + 1; i < right; i++) {int sum = val[left] * val[i] * val[right];sum += solve(left, i) + solve(i, right);rec[left][right] = Math.max(rec[left][right], sum);}return rec[left][right];}
}
2. 动态规划

第 1 步:设计状态
dp[i][j] = x 表示,戳破气球 i 和气球 j 之间(开区间,不包括 i 和 j)的所有气球,可以获得的最高分数为 x。

第 2 步:状态转移方程

i>j之间没有气球 均为0
第 3 步:考虑初始化

base case 已经都被初始化为 0
int[][] dp = new int[n + 2][n + 2];

第 4 步:考虑输出
dp[0][n+1] )


斜着遍历较难实现,一般从上到下实现

时间复杂度:O(N^3) 空间复杂度:O(N^2)

class Solution {public int maxCoins(int[] nums) {int n = nums.length;int[][] rec = new int[n + 2][n + 2];int[] val = new int[n + 2];val[0] = val[n + 1] = 1;for (int i = 1; i <= n; i++) {val[i] = nums[i - 1];}for (int i = n - 1; i >= 0; i--) {for (int j = i + 2; j <= n + 1; j++) {for (int k = i + 1; k < j; k++) {int sum = val[i] * val[k] * val[j];sum += rec[i][k] + rec[k][j];rec[i][j] = Math.max(rec[i][j], sum);}}}return rec[0][n + 1];}
}

【总结】

1. 动态规划流程

第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩

2.关于「状态」的穷举,最重要的一点就是:状态转移所依赖的状态必须被提前计算出来。 通过 初始状态的base case 和最终状态 推导出 i,j 的遍历方向,保证正确的状态转移
3.关键在于 dp 数组的定义,需要避免子问题互相影响,所以我们反向思考,将 dp[i][j] 的定义设为开区间,考虑最后戳破的气球是哪一个,以此构建了状态转移方程。
4. 回溯算法伪代码以及套路

回溯算法超时 需要结合记忆化搜索

int res = Integer.MIN_VALUE;
/* 输入一组气球,返回戳破它们获得的最大分数 */
int maxCoins(int[] nums) {backtrack(nums, 0); return res;
}
/* 回溯算法的伪码解法 */
void backtrack(int[] nums, int socre) {if (nums 为空) {res = max(res, score);return;}for (int i = 0; i < nums.length; i++) {int point = nums[i-1] * nums[i] * nums[i+1];int temp = nums[i];// 做选择在 nums 中删除元素 nums[i]// 递归回溯backtrack(nums, score + point);// 撤销选择将 temp 还原到 nums[i]}
}
根据题意定义出口(可选)
for 选择 in 选择列表:# 做选择将该选择从选择列表移除路径.add(选择)backtrack(路径, 选择列表)# 撤销选择路径.remove(选择)将该选择再加入选择列表
https://labuladong.gitbook.io/algo/di-ling-zhang-bi-du-xi-lie/hui-su-suan-fa-xiang-jie-xiu-ding-ban

参考链接:https://leetcode-cn.com/problems/burst-balloons/solution/dong-tai-gui-hua-tao-lu-jie-jue-chuo-qi-qiu-wen-ti/

转载链接:https://leetcode-cn.com/problems/burst-balloons/solution/chuo-qi-qiu-by-leetcode-solution/

[Leetcode][第312题][JAVA][戳气球][动态规划][记忆化搜索]相关推荐

  1. [Leetcode][第322题][JAVA][零钱兑换][回溯][记忆化搜索][动态规划]

    [问题描述][中等] [解答思路] 1. 递归(超时) class Solution {int res = Integer.MAX_VALUE;public int coinChange(int[] ...

  2. 力扣312题:戳气球

    力扣312题:戳气球 题目描述 有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.戳破第 i 个气球,你可以获得 nums ...

  3. 专题7:动态规划 记忆化搜索

    1. 什么是动态规划 ? 这是算法导论对动态规划的定义: 动态规划( dynamic programming,常简称为 dp ) 与分治方法相似,都是通过组合子问题的解来求解原问题( 在这里,&quo ...

  4. 【LeetCode】我能赢吗 [M](记忆化搜索)

    464. 我能赢吗 - 力扣(LeetCode) 一.题目 在 "100 game" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和 达到或 ...

  5. [Leetcode][第486题][JAVA][预测赢家][动态规划][递归]

    [问题描述][中等] [解答思路] 1.递归 复杂度 class Solution {public boolean PredictTheWinner(int[] nums) {return total ...

  6. [Leetcode][第392题][JAVA][判断子序列][动态规划][双指针]

    [问题描述][简单] [解答思路] 1. 双指针 时间复杂度:O(N+M) 空间复杂度:O(1) class Solution {public:bool isSubsequence(string s, ...

  7. [剑指offer]面试题第[49]题[Leetcode][第264题][JAVA][丑数][动态规划][堆]

    [问题描述][中等] [解答思路] 1. 动态规划 时间复杂度:O(N) 空间复杂度:O(N) class Solution {public int nthUglyNumber(int n) {int ...

  8. [蓝桥杯][2014年第五届真题]地宫取宝(记忆化搜索)

    题目描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  9. 2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索

    邱老师降临小行星 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Des ...

最新文章

  1. nodejs Yarn替代npm的包管理——快速、安全、可靠性高的依赖管理
  2. 利用matlab绘制函数图像
  3. git常用命令/mac上从零完成本地上传和下载github代码
  4. jQuery天猫商品分类导航菜单
  5. 编码(decode与encode)
  6. stlink stm8接口定义_stm8,swim接口
  7. html+css罗盘式旋转时钟
  8. python死循环_python中死循环
  9. Linux 操作系统常用以下哪种编译器,Linux 操作系统期末复习资料(Alpha版)
  10. 目前所有ewebeditor版本***的漏洞与问题总结
  11. LINGO学习笔记01
  12. 读书笔记--项亮《推荐系统实践》第一章
  13. 阅读笔记:Zero-Effort Cross-Domain Gesture Recognition with Wi-Fi
  14. 全身捕捉vr_在VR内部制作动画:混合运动捕捉和关键帧
  15. 精通Java事务编程(8)-可串行化隔离级别之可串行化的快照隔离
  16. DL框架之DL4J/Deeplearning4j:深度学习框架DL4J/Deeplearning4j的简介、安装、使用方法之详细攻略
  17. 数据库主键概念与实际运用操作
  18. 关于用友T3 Automation错误(-2147024770)
  19. macOS: 查看隐藏文件
  20. 材料力学经典测试题目

热门文章

  1. 关于电脑自动获取和静态IP的问题
  2. python核心编程第六章练习6-12
  3. java连接u盘_虚拟机VM6.0 LINUX redhat 挂接U盘,访问U盘
  4. Android studio 导入module方法
  5. Android应用程序显示未读消息计数
  6. javascript各种事件
  7. 简单快速的用SpringBoot访问静态资源(图片、html)
  8. java spring注入 静态方法_java相关:spring为类的静态属性实现注入实例方法
  9. 没有android:padding属性,android自定义无上下padding的textview
  10. c语言安卓贪吃蛇代码下载,C语言贪吃蛇代码