
这个问题看起来很难懂,实际上我们将他变换一下就是你要删除一种数字n,而且是所有的n并获得n*n的个数的点数,那么n-1与n+1的数字必须删除且不获得点数,即不能选择与他相邻的自然数。那么我们新建一个数组sum,索引i代表数字n,那么sum[i]的值,即为所有数字n的总和,这里我们将nums中的最大值定为sum的大小
计算方法如下,
那么现在的问题就是,取数组sum左右不相邻的数并组成最大值,这就是打家劫舍问题了,所以这样这个问题就转移成功了,以下是所有代码
public int deleteAndEarn(int[] nums) {
if(nums.length==1)
return nums[0];
int maxVal = Arrays.stream(nums).max().getAsInt();
int[] sum = new int[maxVal+1];
for (int i:nums)
sum[i] +=i;
int n= maxVal;
int[] dp =new int[n+1];
dp[0]=0;
dp[1] = sum[1];
for (int i = 2; i <= n; i++) {
dp[i] = Math.max(dp[i-1],dp[i-2]+sum[i]);
}
return dp[n];
}
动态规划解决删除并获得点数问题
1421

被折叠的 条评论
为什么被折叠?



