Skip to content

Commit 382b4e9

Browse files
author
橙澈
committed
week06
1 parent 3933312 commit 382b4e9

2 files changed

Lines changed: 74 additions & 1 deletion

File tree

Week06/NOTE.md

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,20 @@
1-
学习笔记
1+
学习笔记
2+
3+
// 打家劫舍
4+
5+
状态定义:
6+
7+
设动态规划列表 dpdp ,dp[i]dp[i] 代表前 ii 个房子在满足条件下的能偷窃到的最高金额。
8+
转移方程:
9+
10+
设: 有 nn 个房子,前 nn 间能偷窃到的最高金额是 dp[n]dp[n] ,前 n-1n−1 间能偷窃到的最高金额是 dp[n-1]dp[n−1] ,此时向这些房子后加一间房,此房间价值为 numnum ;
11+
12+
加一间房间后: 由于不能抢相邻的房子,意味着抢第 n+1n+1 间就不能抢第 nn 间;那么前 n+1n+1 间房能偷取到的最高金额 dp[n+1]dp[n+1] 一定是以下两种情况的 较大值 :
13+
14+
不抢第 n+1n+1 个房间,因此等于前 nn 个房子的最高金额,即 dp[n+1] = dp[n]dp[n+1]=dp[n]
15+
抢第 n+1n+1 个房间,此时不能抢第 nn 个房间;因此等于前 n-1n−1 个房子的最高金额加上当前房间价值,即 dp[n+1] = dp[n-1] + numdp[n+1]=dp[n−1]+num ;
16+
细心的我们发现: 难道在前 nn 间的最高金额 dp[n]dp[n] 情况下,第 nn 间一定被偷了吗?假设没有被偷,那 n+1n+1 间的最大值应该也可能是 dp[n+1] = dp[n] + numdp[n+1]=dp[n]+num 吧?其实这种假设的情况可以被省略,这是因为:
17+
18+
假设第 nn 间没有被偷,那么此时 dp[n] = dp[n-1]dp[n]=dp[n−1] ,此时 dp[n+1] = dp[n] + num = dp[n-1] + numdp[n+1]=dp[n]+num=dp[n−1]+num ,即两种情况可以 合并为一种情况 考虑;
19+
假设第 nn 间被偷,那么此时 dp[n+1] = dp[n] + numdp[n+1]=dp[n]+num 不可取 ,因为偷了第 nn 间就不能偷第 n+1n+1 间。
20+
最终的转移方程: dp[n+1] = max(dp[n],dp[n-1]+num)dp[n+1]=max(dp[n],dp[n−1]+num)

Week06/code.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// 打家劫舍
2+
var rob = function(nums) {
3+
if (nums.length === 0) {return 0}
4+
if (nums.length === 1) {return nums[0]}
5+
let n = nums.length
6+
let res = Array.from(new Array(n),() => []);
7+
res[0][0] = 0
8+
res[0][1] = nums[0]
9+
for (let i = 1; i< n; i++) {
10+
res[i][0] = Math.max(res[i - 1][1], res[i - 1][0])
11+
res[i][1] = res[i - 1][0] + nums[i]
12+
}
13+
return Math.max(res[n - 1][0], res[ n -1 ][1])
14+
};
15+
16+
var rob = function(nums) {
17+
let pre = 0
18+
let cur = 0
19+
let temp = 0
20+
for (let i = 0; i < nums.length; i++) {
21+
temp = cur
22+
cur = Math.max(cur, pre + nums[i])
23+
pre = temp
24+
}
25+
return cur
26+
};
27+
28+
// 打家劫舍二
29+
var rob = function(nums) {
30+
if (nums.length === 1) {return nums[0]}
31+
if (nums.length === 0) {return 0}
32+
let pre = 0
33+
let cur = 0
34+
let temp = 0
35+
let res = []
36+
// 第一个不偷
37+
for (let i = 1; i < nums.length; i++) {
38+
temp = cur
39+
cur = Math.max(cur, pre + nums[i])
40+
pre = temp
41+
}
42+
res.push(cur)
43+
pre = 0
44+
cur = nums[0]
45+
temp = 0
46+
// 第一个偷
47+
for (let i = 1; i < nums.length - 1; i++) {
48+
temp = cur
49+
cur = Math.max(cur, pre + nums[i])
50+
pre = temp
51+
}
52+
res.push(cur)
53+
return Math.max(...res)
54+
};

0 commit comments

Comments
 (0)