标签(空格分隔): LeetCode
动态规划的easy题,可是我还是做了很久,。然而,还是做出来了。
题目的大致意思是给定一个数组,求出不相邻的数之和的最大值。
2 1 1 2 —–》4
1.分解子问题
就拿这个2 1 1 2
来说,我们可以先求出2 1 1
的最值,然后加上2
后再来判断是加2
好还是不加2
好。其中不加2
不是因为加了2
结果变小,而是因为我们选择了2 1 1
的最后一个1
,此时加上2
后就不满足不相邻的条件了。于是递推我们可以先计算2 1
后再来判断加1
的情况。
2.确定状态
dp[i]==j
表示前i+1
个数的最值为j
3.确定初始状态
dp[0]=nums[0];
dp[1]=Math.max(nums[0],nums[1])
4.确定递推公式
dp[i]=Math.max(dp[i−2]+nums[i],dp[i−1])
5.编码
public class Solution {
public int rob(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int[] dp = new int[nums.length];
dp[0] = nums[0];
if (nums.length == 1) {
return dp[0];
}
dp[1] = Math.max(nums[0], nums[1]);
if (nums.length == 2) {
return dp[1];
}
for (int i = 2; i < nums.length; i++) {
dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[nums.length - 1];
}
public static void main(String[] args) {
Solution s = new Solution();
int[] nums = {2, 1, 1, 2};
System.out.println(s.rob(nums));
}
}