代码随想录算法训练营第四十八天|打家劫舍系列问题

198.打家劫舍 

题目链接:198. 打家劫舍

dp[i]表示从第一个房间到当前房间所能获得的最高金额。

当前房间所能获得的最高金额由两种情况得到:

  1. 偷当前房间,那么前一个房间不能偷:dp[i]=dp[i-2]+nums[i];
  2. 不偷当前房间,与上个房间的最大金额相同:dp[i]=dp[i-1];

得到递推公式:dp[i]=fmax(dp[i-2]+nums[i],dp[i-1])

int rob(int* nums, int numsSize){
    if(numsSize==1)     return nums[0];
    if(numsSize==2)     return fmax(nums[0],nums[1]);
    int* dp=(int*)malloc(sizeof(int)*numsSize);
    dp[0]=nums[0];
    dp[1]=fmax(dp[0],nums[1]);
    for(int i=2;i

213.打家劫舍II  

题目链接:213. 打家劫舍 II

房屋成了个环,直觉写出来的代码,居然就过了,和卡哥思路一样。

设置两个dp数组,一个考虑去除尾元素的最高金额,一个考虑去除首元素的最高金额,结果取两个最大值。

一次遍历将两个dp数组进行赋值,算是一种优化吧。

int rob(int* nums, int numsSize){
    if(numsSize==1)     return nums[0];
    if(numsSize==2)     return fmax(nums[0],nums[1]);
    //dp1不考虑尾元素
    int* dp1=(int*)malloc(sizeof(int)*(numsSize-1));
    //dp2不考虑首元素
    int* dp2=(int*)malloc(sizeof(int)*(numsSize-1));
    memset(dp1,0,sizeof(int)*(numsSize-1));
    memset(dp2,0,sizeof(int)*(numsSize-1));
    dp1[0]=nums[0],dp1[1]=fmax(nums[0],nums[1]);
    dp2[0]=nums[numsSize-1],dp2[1]=fmax(nums[numsSize-1],nums[numsSize-2]);
    for(int i=2;i

你可能感兴趣的:(算法,数据结构,leetcode,c语言,动态规划)