您的位置:首页 > 其它

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]同理。

最后再对头尾两个状态做一下判断。

于是写出代码如下:

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];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: