题目描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210512163107422.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3o3NTQ5MTYwNjc=,size_16,color_FFFFFF,t_70)
错误代码
public static int deleteAndEarn(int[] nums) {
int ans=0;
Arrays.sort(nums);
HashMap<Integer, Integer> m1 = new HashMap<Integer, Integer>();
for(int i=0;i<nums.length;i++) {
if(m1.containsKey(nums[i])) m1.put(nums[i], m1.get(nums[i])+1);
else m1.put(nums[i], 1);
}
while(!m1.isEmpty()) {
if(m1.size()==1) {
for (Integer key : m1.keySet()) {
ans+=key*m1.get(key);
m1.remove(key);
}
return ans;
}
if(m1.size()==2) {
int firstkey=-1;
boolean flag=false;
for (Integer key : m1.keySet()) {
if(firstkey==-1) firstkey = key;
else {
if(Math.abs(key-firstkey)==1) {
if(key*m1.get(key)>firstkey*m1.get(firstkey)) ans+=key*m1.get(key);
else ans+=firstkey*m1.get(firstkey);
}else{
ans+=key*m1.get(key);
ans+=firstkey*m1.get(firstkey);
}
return ans;
}
}
}
int Fmax = -1;
int Smax = -1;
int Tmax = -1;
for (Integer key : m1.keySet()) {
if(key>Fmax) {
Tmax = Smax;
Smax = Fmax;
Fmax=key;
continue;
}
if(key>Smax && key<Fmax) {
Tmax = Smax;
Smax = key;
continue;
}
if(key>Tmax) {
Tmax = key;
continue;
}
}
if(Fmax-Smax>=2) {
ans+=Fmax*m1.get(Fmax);
m1.remove(Fmax);
}
else {
int temp1 = Fmax*m1.get(Fmax)+Tmax*m1.get(Tmax);
int temp2 = Smax*m1.get(Smax);
if(temp1>temp2) {
ans+=Fmax*m1.get(Fmax);
m1.remove(Fmax);
m1.remove(Smax);
}else {
ans+=Smax*m1.get(Smax);
m1.remove(Smax-1);
m1.remove(Fmax);
m1.remove(Smax);
}
}
}
return ans;
}
正确思路
- 我怎么感觉又是动态规划…
- 原来是之前做的打家劫舍的马甲版…
- 定义状态 dp[i] 表示遍历到数字 i 时能获得的最多点数。
- 状态转移方程如下:dp[i] = max( dp[i - 2] + sum[i], dp[i - 1])
- 即要不然选择最中间那个 要不然选择左边和右边那个
代码
public int deleteAndEarn(int[] nums) {
int max = Arrays.stream(nums).max().getAsInt();
int[] sum = new int[max + 1];
for (int x : nums) {
sum[x] += x;
}
return rob(sum);
}
public int rob(int[] sum) {
int n = sum.length;
int[] dp = new int[n];
dp[0] = sum[0];
dp[1] = Math.max(sum[0], sum[1]);
for (int i = 2; i < n; i++) {
dp[i] = Math.max(dp[i - 2] + sum[i], dp[i - 1]);
}
return dp[n - 1];
}