目录
按摩师
打家劫舍
打家劫舍2
删除并获得点数
粉刷房子
按摩师
面试题 17.16. 按摩师
最大值问题
f : 预约此次的最长时间 g :不预约此次的最长时间
出现的错误:return max(f[n - 1]), g[n - 1]);
注意:①题目没给nums的范围,if(n == 0) return 0;没有判0,就会报错
②奇怪的是不是在执行的时候报错,而是在运行样例的时候报这个错误
参考代码
class Solution {
public:
int massage(vector<int>& nums) {
int n = nums.size();
vector<int> f(n), g(n);
if(n == 0) return 0;
f[0] = nums[0];
for(int i = 1; i < n; i++)
{
f[i] = g[i - 1] + nums[i];
g[i] = max(f[i - 1], g[i - 1]);
}
return max(f[n - 1], g[n - 1]);
//return max(f[n - 1]), g[n - 1]);
}
};
打家劫舍
198. 打家劫舍
参考代码
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
vector<int> f(n), g(n);
f[0] = nums[0];
for(int i = 1; i < n; i++)
{
f[i] = g[i - 1] + nums[i];
g[i] = max(f[i - 1], g[i - 1]);
}
return max(f[n - 1], g[n - 1]);
}
};
打家劫舍2
213. 打家劫舍 II
最大值问题
f : 取当前位置的值,且是当前位置为结尾的最大值
g:不取当前位置的值,且是当前位置为结尾的最大值
注意点:①传到函数参数的问题,这里的有效区间是[left, right]
②按照nums[0] 去与不取划分,因为nums.size() >= 1,按照nums[2]划分这么写会出现下标越界
参考代码
class Solution {
public:
int rob(vector<int>& nums) {
return max(nums[0] + _rob(nums, 2, nums.size() - 2), _rob(nums, 1, nums.size() - 1));
}
int _rob(vector<int>& nums, int left, int right)
{
if(left > right) return 0;
int n = nums.size();
vector<int> f(n), g(n);
// vector<int> f[n], g[n];
f[left] = nums[left];
for(int i = left + 1; i <= right; i++)
{
f[i] = g[i - 1] + nums[i];
g[i] = max(g[i - 1], f[i - 1]);
}
return max(f[right], g[right]);
// return max(f[i], g[i]);
}
};
删除并获得点数
740. 删除并获得点数
注释掉的也对,没发现写成arr[i - 1],10000取不上,然后改成10002
参考代码1
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
// vector<int> f(10002), g(10002), arr(10002);
// for(auto e : nums)
// arr[e] += e;
// for(int i = 1; i <= 10001; i++)
// {
// f[i] = g[i - 1] + arr[i - 1];
// g[i] = max(g[i - 1], f[i - 1]);
// }
// return max(f[10001], g[10001]);
vector<int> f(10001), g(10001), arr(10001);
for(auto e : nums)
arr[e] += e;
f[0] = arr[0];
for(int i = 1; i < 10001; i++)
{
f[i] = g[i - 1] + arr[i];
g[i] = max(g[i - 1], f[i - 1]);
}
return max(f[10000], g[10000]);
}
};
注意:①这个地方是arr[i] , 不是nums[i]
☆☆②变量名和函数名一样
vs下可以看出,这里的max是一个变量不是函数 ,对于下面的报错的理解:这不是一个函数,不能有()
明显调用的表达式前的括号必须具有(指针)函数类型
也不是不能改:
力扣下:报错也是很明显了 被调用的对象不是函数或者函数指针
参考代码2
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
int n = nums.size();
int m = 0;
for(auto e : nums)
m = max(e, m);
vector<int> f(m + 1), g(m + 1), arr(m + 1);
for(auto e : nums)
arr[e] += e;
f[0] = arr[0];//可以不写,因为最小是1;
for(int i = 1; i < m + 1; i++)
{
f[i] = g[i - 1] + arr[i];//
g[i] = max(f[i - 1], g[i - 1]);
}
return max(g[m], f[m]);
}
};
粉刷房子
LCR 091. 粉刷房子
我写的都是没有扩容,一维dp初始化的并不多,且不用偏移量
错误 ①return min(red[n - 1], max(blue[n - 1], green[n - 1]));
②
参考代码
class Solution {
public:
int minCost(vector<vector<int>>& costs) {
int n = costs.size();
vector<int> red(n), blue(n), green(n);
red[0] = costs[0][0];
blue[0] = costs[0][1];
green[0] = costs[0][2];
for(int i = 1; i < n; i++)
{
red[i] = min(blue[i - 1], green[i - 1]) + costs[i][0];
blue[i] = min(red[i - 1], green[i - 1]) + costs[i][1];
green[i] = min(red[i - 1], blue[i - 1]) + costs[i][2];
}
return min(red[n - 1], min(blue[n - 1], green[n - 1]));
// return min(red[n - 1], max(blue[n - 1], green[n - 1]));
}
};