0
点赞
收藏
分享

微信扫一扫

【动态规划之练习dp数组的构成】———LeetCode 198.打家劫舍

流计算Alink 2022-02-10 阅读 50

方法一:动态规划

首先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。

如果房屋数量大于两间,应该如何计算能够偷窃到的最高总金额呢?对于第 k (k>2)间房屋,有两个选项:

偷窃第 k 间房屋,那么就不能偷窃第 k−1 间房屋,偷窃总金额为前 k−2 间房屋的最高总金额与第 kkk 间房屋的金额之和。

不偷窃第 k 间房屋,偷窃总金额为前 k−1间房屋的最高总金额。

在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前 k间房屋能偷窃到的最高总金额。

用 dp[i]表示前 iii 间房屋能偷窃到的最高总金额,那么就有如下的状态转移方程:

边界条件为:

最终的答案即为 dp[n−1],其中 n是数组的长度。

int rob(int* nums, int numsSize)
{
    if(numsSize==0)
        return 0;
    if(numsSize==1)
        return nums[0];

    int dp[numsSize];
    dp[0] = nums[0];
    dp[1] = fmax(nums[0],nums[1]);
    int i;
    
    for(i=2;i<numsSize;i++)
        dp[i] = fmax(dp[i-2]+nums[i],dp[i-1]);
    return dp[numsSize-1];
}
举报

相关推荐

0 条评论