动态规划:
Si:偷前i间房能获得的最大金额
Hi:第i间房的价值
每到一间房按偷或者不偷两种情况考虑:
偷:Sn-2+Hn(前n-2间房能够偷到最大价值+本间房的价值)
不偷:Sn-1
int rob(vector<int>& nums) {
int n = nums.size();
if (n == 0) return 0;
if (n == 1) return nums[0];
vector<int>state(n, 0); //用于储存Si
state[0] = nums[0]; //第一个房子
state[1] = max(nums[0], nums[1]); //第二个房子
for (int i = 2; i < n; i++)
state[i] = max(state[i - 1], state[i - 2] + nums[i]);
return state[n-1];
}