链接: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]; };
时间: 2024-10-10 02:53:17