动态规划-LCR 089.打家劫舍-力扣(LeetCode)
一、题目解析
结合示例1,我们能得知对于小偷而言不能连续偷相连的房间,且需要保证偷窃的金额最高。
二、算法解析
1.状态表示
我们想知道到最后一个房子时所偷窃的最高金额,所以dp[i]表示在i位置时,所偷到的最大价值。
但我们也可以知道在最后一个房子时,是可以选择是否偷窃的,所以根据这个又能细化状态。
f[i]表示:到达i位置时,偷取最后一个房子,此时的最大金额
g[i]表示:到达i位置时,不偷最后一个房子,此时的最大金额
2.状态转移方程
省流:f[i] = nums[i]+g[i-1]
g[i] = max(f[i-1],g[i-1])
3.初始化
f[0]=nums[0],g[0]=0
4.填表顺序
从左往右填表并且两个表一起填写
5.返回值
我们需要知道到最后位置的最大金额,所以return max(f[i-1],g[i-1])
先跟着思考一番,在自己动手写代码,链接:LCR 089. 打家劫舍 - 力扣(LeetCode)
三、代码示例
class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();vector<int> f(n),g(n,0);f[0] = nums[0];for(int i = 1;i<n;i++){f[i] = g[i-1]+nums[i];g[i] = max(f[i-1],g[i-1]);}return max(f[n-1],g[n-1]);}
};
看到最后,如果对您有所帮助还请点赞、收藏、关注,点点关注不迷路,我们下期再见!