题目

方法一:动态规划
public class Rob {
int max = 0;
public int rob(int[] nums) {
//动态规划,假设打劫n间,由于不能打劫相邻的两间,那么最后一间就有打与不打两种情况
//情况1打,最高金额=最后一间的金额+打劫前n-2间的总金额
//情况2不打,最高金额=打劫前n-1间的总金额
//dp[n-1]代表第n间的打劫金额,由此可知,f(n) = max((dp[n-1]+f(n-2)),f(n-1))
//特殊情况,只有1间时,f(1) = dp[0]。只有2间时,f(2) = max(dp[0], dp[1])
int f1 = nums[0];
if (nums.length==1) {
return f1;
}
int f2 = Math.max(f1, nums[1]);
if (nums.length==2) {
return f2;
}
deal(nums, 2, f2, f1);
return max;
}
public void deal(int[] nums, int k, int n1, int n2) {
if (k == nums.length) {
return;
}
int n = Math.max(nums[k]+n2, n1);
max = Math.max(max, n);
n2 = n1;
n1 = n;
deal(nums, k+1, n1, n2);
}
public static void main(String[] args) {
Rob rob = new Rob();
//int nums[] = new int[]{1,2,3,1};
int nums[] = new int[]{2,7,9,3,1};
System.out.println(rob.rob(nums));
}
}
LeetCode测试结果
动态规划解LeetCode之打劫问题,
该代码实现了一个使用动态规划解决LeetCode中关于打劫房屋以获取最大金额的问题。动态规划思路是计算每个房子的最大收益,避免连续抢劫相邻的房子。程序首先处理特殊情况,然后递归地处理剩余的房子,更新最大值。
376

被折叠的 条评论
为什么被折叠?



