C++11 算法:专业小偷的最佳偷窃路线
这是一个典型的动态规划问题。假设 dp[i] 表示偷取前 i 个房屋能够获得的最高金额。对于第 i 个房屋,有两种选择:
- 偷取第
i个房屋,则前一个房屋(第i-1个房屋)不能偷取,所以偷取前i个房屋能够获得的最高金额是dp[i-2] + nums[i]。 - 不偷取第
i个房屋,则偷取前i个房屋能够获得的最高金额是dp[i-1]。
因此,可以得到状态转移方程:
dp[i] = max(dp[i-2] + nums[i], dp[i-1])
边界条件为:
dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])
最终,结果就是 dp[nums.size()-1]。
下面是使用 C++11 实现的代码:
#include <vector>
#include <algorithm>
int rob(vector<int>& nums) {
int n = nums.size();
if (n == 0) return 0;
if (n == 1) return nums[0];
vector<int> dp(n, 0);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for (int i = 2; i < n; i++) {
dp[i] = max(dp[i-2] + nums[i], dp[i-1]);
}
return dp[n-1];
}
通过以上代码,就可以计算出不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。
原文地址: https://www.cveoy.top/t/topic/cqZP 著作权归作者所有。请勿转载和采集!