题目
你是一个专业的强盗,计划抢劫沿街的房屋。每间房都藏有一定的现金,阻止你抢劫他们的唯一的制约因素就是相邻的房屋有保安系统连接,如果两间相邻的房屋在同一晚上被闯入,它会自动联系警方。
给定一个代表每个房屋的金额的非负整数列表,确定你可以在没有提醒警方的情况下抢劫的最高金额。
思路
这一题标注的动态规划。我们来用动态规划的思想来做。动态规划的关键是:1定义问题;2找出递归式;3:初始化。
这个题的问题定义:dp[i] 抢劫o-i的房子获得的最大利润。
dp[0]=nums[0]; 如果只打劫第一家,那只能获利nums[0]
dp[1]=Math.max(nums[0],nums[1]); 如果可以打劫前两家,那么可以选择一家钱的打劫。
dp[i]=Max(dp[i - 2] + nums[2], dp[i - 1]); 如果打劫前i家,那么可以选择打劫前i-2家和第i家,或者不打劫第i家(dp[i-1])
代码(带测试)
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++)
arr[i] = scanner.nextInt();
System.out.println(solution.rob(arr));
}
public int rob(int[] nums) {
if(nums == null || nums.length == 0) return 0;
if(nums.length == 1) return nums[0];
if(nums.length == 2) return Math.max(nums[0],nums[1]);
int length = nums.length;
int[] dp = new int[length];
dp[0] = nums[0];
dp[1] = Math.max(nums[0],nums[1]);
for(int i = 2; i < length; i++) {
dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[length - 1];
}
}
网友评论