预处理:
先创建一个arr[i]数组,表示:“i”这个数出现的值的总和
举例:
讲数组nums中的数,统计到arr中,然后在arr中做一次“打家劫舍”问题
1.状态表示
是什么?dp表中里的值所表示的含义就是状态表示
f[i]表示:选到i位置时,nums[i]必选,此时能获得的最大点数
g[i]表示:选到i位置时,nums[i]不选,此时能获得的最大点数
2.状态转移方程
i位置必选,那么i-1位置不选 ,刚好就是g[i]的状态表示
f[i] = g[i-1] + arr[i]
i位置不选,则i-1位置不确定, 分两种情况:
1.选i-1 f[i-1]
2.不选i-1 g[i-1]
g[i] = max(f[i-1] , g[i-1])
3.初始化
保证填表的时候不越界
f[0] = arr[0] , g[0] = 0
4.填表顺序
为了填写当前状态的时候,所需要的状态已经计算过了
从左往右填表,两个表同时填
5.返回值
题目要求+状态表示
max(f[n-1],g[n-1])
6.代码
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
const int N = 10001;
//预处理
int arr[N] = {0};
for(auto x : nums) arr[x] += x;
//打家劫舍
//1.创建dp表
vector<int>f(N);
vector<int>g(N);
//2.初始化
f[0] = arr[0];
g[0] = 0;
//3.填表
for(int i = 1;i < N;i++)
{
f[i] = g[i-1] + arr[i];
g[i] = max(f[i-1],g[i-1]);
}
//4.返回值
return max(f[N-1] ,g[N-1]);
}
};