动态规划练习:
给定一组数据为房间里的价值,进行抢劫,如果抢劫相邻的房间就会报警,求安全情况下可以抢劫到的最大值(leetcode198)
Example 1:
Input: [1,2,3,1] Output: 4 Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3). Total amount you can rob = 1 + 3 = 4.
Example 2:
Input: [2,7,9,3,1] Output: 12 Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1). Total amount you can rob = 2 + 9 + 1 = 12.
思路:动态规划简单练习题。用来好好体会状态方程的定义和转移。不同状态的定义对应不同的转移方程。
1.状态定义为:dp[i]是考虑从0...i之间房子中取得的最大值
状态转移即为:dp[i] = Max{v[i]+dp[i-2],v[i-1]+dp[i-3],......,v[2]+dp[0],v[1],v[0]}。
class Solution {
public int rob(int[] nums) {
int n = nums.length;
if(n == 0){
return 0;
}
int[] dp = new int[n];
dp[0] = nums[0];
for (int i = 1; i < dp.length; i++) {
for (int j = i; j >= 0; j--) {
dp[i] = Math.max(dp[i], nums[j] + (j - 2 >= 0 ?dp[j - 2]:0));
}
}
return dp[n-1];
}
}
2.状态定义为:dp[i]是考虑从i...n-1之间房子中取得的最大值.
状态转移即为:dp[i] = Max{v[i]+dp[i+2],v[i+1]+dp[i+3],......,v[n-3]+dp[n-1],v[n-2],v[n-1]}。
class Solution {
public int rob(int[] nums) {
int n = nums.length;
if(n == 0){
return 0;
}
int[] dp = new int[n];
dp[n-1] = nums[n-1];
for (int i = n-2; i >= 0; i--) {
for (int j = i; j < n; j++) {
dp[i] = Math.max(dp[i], nums[j] + (j + 2 < n ?dp[j + 2]:0));
}
}
return dp[0];
}
}