码迷,mamicode.com
首页 > 其他好文 > 详细

leetCode198-House Robber-状态压缩

时间:2015-04-01 20:03:09      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:leetcode   状态压缩 198   

链接:https://leetcode.com/problems/house-robber/

这道理可以看做是状态压缩,每两个数字看做是一行,状态有3个,故需要F[N][3]的数组,F[i][j]就表示第i行状态j时rob的money。

具体状态压缩可以看我这两篇blog: 算法练习系列—hiho1048 状态压缩一(铺地砖)  算法练习系列—hiho1044 状态压缩二(捡垃圾)

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

#define N 10000

class Solution {
public:
	Solution(){
		memset(F, 0, sizeof(int)*N*3);
	}
    int rob(vector<int> &num) {
		if(num.size() == 0) return 0;
		else if(num.size() == 1) return num[0];
		else{
			// 初始化第一行
			F[0][0] = 0;
			F[0][1] = num[1];
			F[0][2] = num[0];
			int maxMoney = max(num[1], num[0]);
			for(int i = 1; i < num.size()-1; i++){
				for(int j = 0; j < 3; j++){     
					int t = j >> 1;
					for(int k = 0; k < 3; k++){
						if( t ==  (k & (1>>0))){      // 判断第i行状态j与第i-1行各个状态是否兼容 即j的倒数第二位与k的倒数第一位是否相同
							F[i][j] = max(F[i-1][k], F[i][j]);	//  输出兼容的最大者
						}
					}
					if((j & (1<<0)) == 1) F[i][j] = F[i][j] + num[i+1];  // 如果状态j最后一位为1则 需要加上该方案数
					if(F[i][j] > maxMoney){                // 求最大的方案数
						maxMoney = F[i][j];
					}
				}
			}
			return maxMoney;
		}
    }
private:
	int F[N][3];
};


leetCode198-House Robber-状态压缩

标签:leetcode   状态压缩 198   

原文地址:http://blog.csdn.net/lu597203933/article/details/44810981

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!