@ 代码随想录算法训练营第8周(C语言)|Day51(动态规划)

@ 代码随想录算法训练营第8周(C语言)|Day51(动态规划)

Day51、动态规划(包含题目 ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III)

198.打家劫舍

题目描述

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

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

题目解答

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

    return dp[numsSize-1];
}

题目总结

打家劫舍。

213.打家劫舍II

题目描述

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

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

题目解答

int rob1(int *nums,int numsSize){
   
    if(numsSize==1){
   
        return *nums;
    }
    int dp[numsSize];
    dp[0]=nums[0];
    dp[1]=nums[0]>nums[1]?nums[0]:nums[1];
    for(int i=2;i<numsSize;i++){
   
        dp[i]=dp[i-1]>dp[i-2]+nums[i]?dp[i-1]:dp[i-2]+nums[i];
    }
    return dp[numsSize-1];


}
int rob(int* nums, int numsSize) {
   
    if(numsSize==1){
   
        return *nums;
    }
    int nums1[numsSize-1];
    int nums2[numsSize-1];
    for(int i=0;i<numsSize-1;i++){
   
        nums1[i]=nums[i];
        nums2[i]=nums[i+1];
    }
    int k1,k2;
    k1=rob1(nums1,numsSize-1);
    k2=rob1(nums2,numsSize-1);
    return k1>k2?k1:k2;
}

题目总结

两种打家劫舍。

337.打家劫舍III

题目描述

在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。

计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。

题目解答

typedef struct TreeNode TreeNode;//就可以不用struct treenode
int *treerob(TreeNode*root){
   
    int*dp=(int*)calloc(2,sizeof(int));//后序遍历
    if(root==NULL){
   
        return dp;
    }
    int*left=treerob(root->left);
    int*right=treerob(root->right);
    dp[0]=root->val+left[1]+right[1];
    dp[1]=fmax(left[0],left[1])+fmax(right[0],right[1]);
    return dp;
}



int rob(struct TreeNode* root) {
   
    int*ret=treerob(root);
    return fmax(ret[0],ret[1]);
}

题目总结

二叉树加动态规划。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-19 09:18:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-19 09:18:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-19 09:18:04       87 阅读
  4. Python语言-面向对象

    2024-02-19 09:18:04       96 阅读

热门阅读

  1. Rust语言之sha-256爆破

    2024-02-19 09:18:04       49 阅读
  2. go redis

    go redis

    2024-02-19 09:18:04      42 阅读
  3. android pdf框架-3,对开源库的探究1

    2024-02-19 09:18:04       45 阅读
  4. 「优选算法刷题」:寻找数组的中心下标

    2024-02-19 09:18:04       54 阅读
  5. 5G固定无线接入(FWA)

    2024-02-19 09:18:04       54 阅读
  6. 民安智库如何做汽车满意度调查

    2024-02-19 09:18:04       48 阅读
  7. 汽车零部件软件开发常用搜索算法

    2024-02-19 09:18:04       43 阅读
  8. iOS总体框架介绍和详尽说明

    2024-02-19 09:18:04       48 阅读
  9. LeetCode213. House Robber II——动态规划

    2024-02-19 09:18:04       49 阅读