题目来自leetcode第740题。
class Solution {
public int deleteAndEarn(int[] nums) {
int maxVal = 0;
for(int i : nums){
maxVal = Math.max(maxVal,i);
}
int[] sum = new int[maxVal+1];
for(int i : nums){
sum[i]+=i;
}
return cal(sum);
}
public int cal(int[] sum){
int first = sum[0];
int second = Math.max(sum[0],sum[1]);
for(int i=2;i<sum.length;i++){
int temp = second;
second = Math.max(second,first+sum[i]);
first = temp;
}
return second;
}
}
我自己没想出来,参考答案后解除。答案中的动态规划思想很是受用。
题目要求如果要获取nums[i]的点数,其值相邻的所有的nums[i]+1和nums[i]-1都要删除,是所有的。
故题解中设计了sum数组来保存相同值的和。
在cal方法中,first和second分别表示数组sum[0, i-1]中的次大值和最大值,在循环过程中,新加入的sum[i]元素,与first求和后再与second比较,得出数组sum[0, i]中的次大值和最大值。
如此操作直至循环结束,最终得出的second即为最大值。