点我查看原题
Java代码
class Solution {
public int deleteAndEarn(int[] nums) {
int[] trans = new int[10001];
for(int i = 0;i < nums.length;i++){
trans[nums[i]] += nums[i];
}
int[] dp = new int[10001];
dp[0] = 0;
dp[1] = trans[1];
for(int i = 2;i < trans.length;i++){
dp[i] = Math.max(dp[i-1], dp[i-2]+trans[i]);
}
return dp[dp.length-1];
}
}
解题思路
em…,很令人蛋疼的一题,咋一看有点像那个经典打家劫舍(实际上就是),但可惜短时间内没想到答案,这个答案是评论区翻到的,主要思路是把这一题的数组转化为打家劫舍的数组,将相同的元素进行一个累加生成一个新的数组,然后对新数组进行dp得到结果就可以了,这里简单贴一下自己打家劫舍的一个题解。
class Solution {
public int rob(int[] nums) {
int[][] dp = new int[nums.length][2];
//当前偷,上一个不偷
//当前不偷,上一个不偷,上一个偷
dp[0][0] = 0+nums[0];
dp[0][1] = 0;
for(int i = 1;i < dp.length;i++){
dp[i][0] = dp[i-1][1]+nums[i];
dp[i][1] = Math.max(dp[i-1][0], dp[i-1][1]);
}
return Math.max(dp[nums.length-1][0], dp[nums.length-1][1]);
}
}