题目
方法一:动态规划
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测试结果