# LeetCode : 0198. House Robber (DP)
###### tags:`leetcode`
> C++ Vscode can be run
```
#include <bits/stdc++.h>
using namespace std;
class BaseSolution {
public:
int rob(vector<int>& nums) {
int robEven = 0, robOdd = 0, n = nums.size();
for (int i = 0; i < n; ++i) {
if (i % 2 == 0) {
robEven = max(robEven + nums[i], robOdd);
} else {
robOdd = max(robEven, robOdd + nums[i]);
}
}
return max(robEven, robOdd);
}
};
//don't combine house so divide Odd (1,3,5,7,9) Even (2,4,6,8,10)
//take easy Max (Odd Total money or Even Total money)
class Solution {
private:
int n;
vector<int> cache;
const int INF = 987654321;
int rob(vector<int>& nums, int index) {
if (index == n) return 0;
if (index > n) return -INF;
int &ret = cache[index];
if (ret != -1) return ret;
int result = nums[index];
result = max(result, nums[index] + rob(nums, index + 2));
result = max(result, nums[index] + rob(nums, index + 3));
return ret = result;
}
public:
int rob(vector<int>& nums) {
n = nums.size();
cache = vector<int>(n, -1);
return max(rob(nums, 0), rob(nums, 1));
}
};
class Solution2{
public:
int rob(vector<int>& nums) {
int n = nums.size(), pre = 0, cur = 0;
for (int i = 0; i < n; i++) {
//cout << "i = " << i << endl;
//cout << "nums[" << i << "] = " << nums[i] << endl;
int temp = max(pre + nums[i], cur);
//cout << "temp =" << temp << endl;
pre = cur;
//cout << "pre = " << pre << endl;
cur = temp;
//cout << "cur = " << cur << endl;
}
return cur;
//example: [5,7,9,3,8,2,9,4,3]
}
};
int main(void)
{
//example: [5,7,9,3,8,2,9,4,3]
Solution ROB;
Solution2 ROB2;
vector<int> intarr = {5,7,9,3,8,2,9,4,3};
int ans = 0;
//ans = ROB.rob(intarr);
ans = ROB2.rob(intarr);
cout << ans << endl;
//cout << "test1\n";
//printf("test\n");
system("pause");
}
```
> Solution2
> Time complexity O(n)
> Space complexity O(1)