Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 2102147

Browse files
committed
#198 打家劫舍:一个房子偷与不偷,由上一个房子决定,用max进行剪枝
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]); dp[i][1] = dp[i - 1][0] + nums[i];
1 parent 155f505 commit 2102147

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package dynamic_programming;
2+
3+
/**
4+
* @author liangqian0723@gmail.com
5+
* @since 2020/3/8 4:42 PM
6+
*/
7+
public class
8+
LC_198_HouseRobber {
9+
/**
10+
* DP解法:
11+
* 一栋房子,小偷是否光顾有两种情况,要么偷,要么不偷。
12+
* 可以用二维数据的方式
13+
* dp[偷到当前房子时的金币数量][偷/不偷], 如果对第一个房子的两种状态,进行递推计算,
14+
* 对比最后一栋房子的时候,哪种方案的金币多,就用哪种方案
15+
* Success: Runtime:0 ms, faster than 100.00% of Java online submissions. Memory Usage:37 MB, less than 5.02% of Java online submissions.
16+
*/
17+
public int rob(int[] nums) {
18+
if (nums == null || nums.length == 0) return 0;
19+
int[][] dp = new int[nums.length][2];
20+
// 第一个房子偷与不偷的方案
21+
dp[0][0] = 0;
22+
dp[0][1] = nums[0];
23+
// 按照隔栋偷的原则,递推下去
24+
for (int i = 1; i < nums.length; i++) {
25+
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);
26+
dp[i][1] = dp[i - 1][0] + nums[i];
27+
}
28+
return Math.max(dp[nums.length - 1][1], dp[nums.length - 1][0]);
29+
}
30+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package dynamic_programming;
2+
3+
import org.junit.Test;
4+
5+
import static org.hamcrest.core.Is.is;
6+
import static org.junit.Assert.assertThat;
7+
8+
/**
9+
* @author liangqian0723@gmail.com
10+
* @since 2020/3/8 4:41 PM
11+
*/
12+
public class LC_198_HouseRobberTest {
13+
@Test
14+
public void house_robby_test() {
15+
LC_198_HouseRobber houseRobber = new LC_198_HouseRobber();
16+
assertThat(houseRobber.rob(new int[]{1, 2, 3, 1}), is(4));
17+
}
18+
}

0 commit comments

Comments
 (0)