1,题目内容
如上图所示,该题目要求我们找出小偷能够偷取的最大的金额,且由于邻居安全系统的存在,不能在同一天晚上偷取两个相邻的住户。所以,小偷只能偷完一家再偷不相邻的另一家。
2,题解思路
首先分析如下的测试案例。
[2,7,9,3,1]
可见,首先,小偷只能从第一家和第二家选择一家来偷,那么怎么保证所偷金额最大呢?采用动态规划策略来思考:
假定偷了第一家,然后,判断偷不偷第二家。由于开始一分钱没有,偷了第二家,金额是7,比第一家2大,故偷第二家而不偷第一家。
后续这样考虑:
判断偷不偷第n家,由于安全系统的存在,肯定不能是偷完第n-1家来偷第n家,而是偷完了第n-2家后来偷第n家。比较偷完第n-2家后的最大金额加上第n家的金额与偷完第n-1家的最大金额,谁大那么偷完第n家的最大金额就是谁。
如下状态转移方程所示:
best(n)=max(best(n-2)+money(n),best(n-1))
初态置为0(小偷还没开始偷呢哈哈)
3,解题代码
int rob(vector<int>& nums) {
int finall[105] = { 0 };
finall[1] = nums[0];
for (int i = 1; i < nums.size(); i++)
{
int temp = finall[i - 1] + nums[i];
if (temp > finall[i])
finall[i + 1] = temp;
else
finall[i + 1] = finall[i];
}
return finall[nums.size()];
}
4,最终结果展示
5,友情提醒
虽然该题成功解决,不过,希望各位coder堂堂正正做人,不要像该题中的robber的所作所为哈哈,否则警察叔叔找上门来我可就管不了了。