每天一道leetcode 打家劫舍(动态规划)

198. 打家劫舍

难度简单839收藏分享切换为英文关注反馈

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入: [2,7,9,3,1]
输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 。

答:

int rob(int* nums, int numsSize){
    if(numsSize==0)
        return 0;
    if(numsSize==1)
    {
        return nums[0];
    }
    int dqmax[numsSize];
    dqmax[0]=nums[0];
    if(nums[0]>nums[1]){dqmax[1]=nums[0];}
    else{dqmax[1]=nums[1];}
    for(int i=2;i<numsSize;i++)
    {
        if(dqmax[i-2]+nums[i]>dqmax[i-1]){dqmax[i]=dqmax[i-2]+nums[i];}
        else{dqmax[i]=dqmax[i-1];}
    }
    return dqmax[numsSize-1];
}

解析:

  • 利用动态规划
  • 递推方程:dqmax[i]=max(dqmax[i-2]+nums[i],dqmax[i-1])
  • 比如当前准备盗窃第k家房子,那现在可以盗取的最大金额只有两种情况
    • 偷窃第 k 间房屋,就不能偷窃第 k-1 间,总金额为前 k-2 间房屋的最高总金额与第 k间房屋的金额之和。
    • 不偷窃第 k 间房屋,总金额为前 k-1间房屋的最高总金额。
  • 建了一个dqmax[],位于当前房子的时候可盗取的最大金额,简单来说,就是前面都是最好的的,现在也是最好的,那就一直是最好的
原文地址:https://www.cnblogs.com/rower/p/12987703.html