leetcode-删除并获得点数
题目链接:题目链接
题目大意:给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
先来一组数据,方便后面,[2,2,3,3,3,4]
这里需要在原先数组的基础上得到一个临时数组arr,这个数组以nums里面的数字为下标,以其中的数字出现次数为值,那么上面的数组就应该是这样的,[0, 0, 2, 3, 1]
那么这个时候对于这个数组进行动态规划,不妨定义数组dp[i]为当前位置所能得到的最大点数,对于dp[i]来说,面临着两个选择,那就是是否删除这个点数,如果选择删除这个点数,那么配套的就是要删除arr中相邻的元素,所以得到的最大点数应该是dp[i-2]+arr[i]*i,如果不删除这个点数,则得到的最大价值应该等于dp[i-1],我们要取的就是这两个的最大值,所以可以得到状态转移方程,dp[i] = max(dp[i-1], dp[i-2]+(arr[i]*i)),在设置一下初始状态就能得到最终的代码了
public int deleteAndEarn(int[] nums) {
int max = -1;
//获取原数组的最大值,方便后面的数组初始化
for(int i = 0; i < nums.length; i++) {
if(nums[i] > max) {
max = nums[i];
}
}
int[] sum = new int[max+1];
//初始化新的数组
for(int i = 0; i < nums.length; i++) {
sum[nums[i]]++;
}
//开始打家劫舍
sum[0] = 0;
//此时的状态转移方程是dp[i] = max(dp[i]*i+dp[i-2], dp[i-1])
for(int i = 2; i < sum.length; i++) {
sum[i] = Math.max(((sum[i]*i)+sum[i-2]), sum[i-1]);
}
return sum[max];
}
暂时看到的最难的题目了