题目描述:
唯一约束是不能连续拿两个房间的钱,只能是隔一个或者更多。
此题可以利用动态规划的想法,利用一个数组arr, arr[i]表示i房间及其以前的可以拿到的最多金钱。
此时针对第i个房间,就有两种情况:1)拿第i个房间的钱,那么就不能拿i-1房间,拿到的钱就是 arr[i-2] + A[i]
2) 不拿第i个房间的钱,那么可以拿到的最多金钱就是 arr[i-1]
取两者较大值,就是arr[i]的值。即 arr[i] = max{arr[i-1], arr[i-2]+A[i]}.
再进一步分析可以看出,计算第i个位置的值时,只与i-1位置和i-2位置的值有关,与之前的都没有关系,所以可以精简到只用两个变量来保存中间结果,这样的话,就要有一个保存最终结果的变量res,在计算每一个位置的值的过程中,时刻更新最终结果res.
初始情况: 当只有一个房间时,能取得的最多金钱就是这个房间的金钱。
当有两个房间时,能取得就是两个房间中金钱较多的那一个。
代码:
long long houseRobber(vector<int> &A) {
// write your code here
if(A.empty())
return 0;
if(A.size() == 1)
return A[0];
long long first = A[0];
long long second = max(A[0],A[1]);
long long res = max(first, second);
for(int i=2; i<A.size(); ++i){
first = max(second, first + A[i]);
if(first > res)
res = first;
swap(first, second);
}
return res;
}