打家劫舍
# 打家劫舍 1
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 1:
输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。
# 分析
1 确定 dp 数组(dp table)以及下标的含义
dp [i]:考虑下标 i(包括...
more...
多重背包
# 题目
有 N 种物品和一个容量为 V 的背包。第 i 种物品最多有 Mi 件可用,每件耗费的空间是 Ci ,价值是 Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。
# 分析
多重背包和 01 背包是非常像的, 为什么和 01 背包像呢?
每件物品最多有 Mi 件可用,把 Mi 件摊开,其实就是一个 01 背包问题了。
例如:
背包最大重量为 10。
物品为:
重量
价值
数量
物品 0
1
15
2
物品 1
3
20
3
物品 2
4
30
2
问背包能背的物品最大价值是多少?
和如下情况有区别么?
重量
价值
数量
物品...
more...
0-1背包
# 题目
有 n 件物品和一个最多能背重量为 w 的背包。第 i 件物品的重量是 weight [i],得到的价值是 value [i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
# 分析
# 二维 dp 数组 01 背包
1 确定 dp 数组以及下标含义
对于背包问题,有一种写法, 是使用二维数组,即 dp【i】【j】 表示从下标为 [0-i] 的物品里任意取,放进容量为 j 的背包,价值总和最大是多少。
2 确定递推公式
dp [i] [j] 有两种情况
第一种 不放物品 i:由 dp [i - 1] [j] 推出,即背包容量为 j,里面不放物品 i...
more...
整数拆分
# 题目
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
示例 1:
输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
# 分析
动态规划五部曲
1 确定 dp 数组及下标的含义
dp [i]:分拆数字 i,得到最大乘积和 dp [i]
2 确定递推公式
dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});
3 dp 的初始化
dp[2] = 1
4 确定遍历顺序
dp [i] 是依靠 dp [i - j]...
more...
斐波那契数
# 题目
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例 1:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
509. 斐波那契数 - 力扣(LeetCode)
# 分析
动规五部曲:
1 确定 dp 数组及下标的含义
dp【i】的定义为:第 i 个数的斐波那契数的值是 dp【i】
2...
more...
合并区间
# 题目
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5]...
more...