File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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)
Original file line number Diff line number Diff line change 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+ } ;
You can’t perform that action at this time.
0 commit comments