题目:
假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。
给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,在不触动报警装置的情况下,你最多可以得到多少钱。
样例:
给定 [3, 8, 4], 返回 8.
思路:
如果选择了抢劫上一个屋子,那么就不能抢劫当前的屋子,所以最大收益就是到上一个屋子为止的最大收益;
如果选择抢劫当前屋子,就不能抢劫上一个屋子,所以最大收益是到上上一个屋子为止的最大收益,加上当前屋子里有的钱。
参考答案:
class Solution {
public:
/*
* @param A: An array of non-negative integers
* @return: The maximum amount of money you can rob tonight
*/
long long houseRobber(vector<int> &A) {
// write your code here
int n = A.size();
if(n==0) return 0;
if(n==1) return A[0];
/*前一次最大收益*/
long int last_max = A[0];
/*当前最大收益,指的是没有打劫第i间屋子的最大收益*/
long int current_max = max(A[0],A[1]);
/*遇到下一个房间,判断如何选择*/
for(int i=2; i<n; i++)
{
long int temp = current_max;
//决定要不要打劫第i间屋子
current_max= max(current_max, last_max+A[i]);
last_max = temp;
//cout<<n<<" "<<current_max<<endl;
/*逗,有个测试用例的数据特别大,int类型装不下,所以不通过。*/
}
return current_max;
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。