213. House Robber II
2016-03-20 22:46
357 查看
原想按照 House Robber那样:
f.resize(nums.size(), vector(2));
//f[i][0] indicates the max value got when the i-th house not broken.
//f[i][1] indicates the max value got when the i-th house broken.
再加一个g数组作为状态变量:
g[i][0]表示取得f[i][0]时,是否用了第一个数,g[i][1]同理。
最后再对头尾两个状态做一下判断。
于是写出代码如下:
但是发现有个样例通不过:【2,2,4,3,2,5】,最后这样后输出9,因为会取用index为0,4,5的3个元素,最后再因为冲突,去掉第一个2,得到9。而答案应该是index为1,3,5的3个元素。这个方案在上述思路中取不到。
新解法:
将f数组改为3维数组。f[i][j][k]; i < n, j < 2, k < 2;
j = 0表示不用当前数,j=1表示加入当前数
k=0表示不用第一个数,k=1表示加入第一个数
代码如下:
f.resize(nums.size(), vector(2));
//f[i][0] indicates the max value got when the i-th house not broken.
//f[i][1] indicates the max value got when the i-th house broken.
再加一个g数组作为状态变量:
g[i][0]表示取得f[i][0]时,是否用了第一个数,g[i][1]同理。
最后再对头尾两个状态做一下判断。
于是写出代码如下:
class Solution { public: int rob(vector<int>& nums) { if (nums.size() == 0) return 0; vector<vector<int> > f(nums.size(), vector<int>(2)); //f[i][0]: the maximum when the i-th house is not broken. f[i][1]: the maximum when the i-th house is broken. vector<vector<int> > g(nums.size(), vector<int>(2)); //whether the first house is broken or not when f[i][[j] is got. 0:not broken;1:broken;2:either broken or not is ok; f[0][0] = 0; f[0][1] = nums[0]; g[0][0] = 0; g[0][1] = 1; for(int i = 1; i < nums.size(); i ++){ f[i][1] = f[i - 1][0] + nums[i]; g[i][1] = g[i - 1][0]; if(f[i - 1][0] > f[i - 1][1]){ f[i][0] = f[i - 1][0]; g[i][0] = g[i - 1][0]; }else if(f[i - 1][0] < f[i - 1][1]){ f[i][0] = f[i - 1][1]; g[i][0] = g[i - 1][1]; }else{ //f[i - 1][0] == f[i -1][1] example:[1, 2, 4, 3, 5]: f[3][0] == f[3][1] f[i][0] = f[i - 1][0]; if(g[i - 1][0] + g[i - 1][1] == 1 || g[i - 1][0] == 2 || g[i - 1][1] == 2) //one is 0 and one is 1, or either one is 2 g[i][0] = 2; else g[i][0] = g[i - 1][0]; } } if(g[nums.size() - 1][1] != 1){ return max(f[nums.size() - 1][0], f[nums.size() - 1][1]); }else{ if(nums.size() > 1) return max(f[nums.size() - 1][0], f[nums.size() - 1][1] - nums[0]); //make a choice between first and last num; else return nums[0]; } } };
但是发现有个样例通不过:【2,2,4,3,2,5】,最后这样后输出9,因为会取用index为0,4,5的3个元素,最后再因为冲突,去掉第一个2,得到9。而答案应该是index为1,3,5的3个元素。这个方案在上述思路中取不到。
新解法:
将f数组改为3维数组。f[i][j][k]; i < n, j < 2, k < 2;
j = 0表示不用当前数,j=1表示加入当前数
k=0表示不用第一个数,k=1表示加入第一个数
代码如下:
class Solution { public: int addValue(int f, int num){ if(f == -1) return -1; else return f + num; } int rob(vector<int>& nums) { if (nums.size() == 0) return 0; vector<vector<vector<int> > > f(nums.size(), vector<vector<int> >(2, vector<int>(2))); //f[i][j][k]: j = 0 j-th house not broken, j = 1 j-th house broken; k = 0, first house not broken, k = 1, first house broken; f[0][0][0] = 0; f[0][1][1] = nums[0]; f[0][0][1] = -1; f[0][1][0] = -1; for(int i = 1; i < nums.size(); i ++){ f[i][1][0] = addValue(f[i - 1][0][0], nums[i]); f[i][1][1] = addValue(f[i - 1][0][1], nums[i]); f[i][0][0] = max(f[i - 1][0][0], f[i - 1][1][0]); f[i][0][1] = max(f[i - 1][0][1], f[i - 1][1][1]); } if(nums.size() != 1) return max(f[nums.size() - 1][1][0], max(f[nums.size()-1][0][1], f[nums.size() - 1][0][0])); else return nums[0]; } };
相关文章推荐
- [Slides notes] Other notes using Excel
- 删数问题--贪心算法+string类的一些应用
- uboot里读sd卡内容
- 结对编程
- WinServer-IIS-svg/woff/woff2字体 404错误
- java第九节-异常
- 串口——————朱老师物联网大讲堂
- http://localhost:63342/pg32/myjs39.html
- 蚁群算法解决tsp问题
- 工厂模式
- WinServer-IIS初始安装及发布网站
- php:格式化字符串
- APP的启动
- [BZOJ1861]书架 做题笔记
- 104.全排列(深搜)搜索与回溯
- java做图表的JFreeChart的使用
- Erlang 游戏开发经验总结
- UIScrollView的滑动视图切换(懒加载)
- 基于Netty开发水利通信软件
- 公约数和公倍数【nyoj40】