当前位置: 代码迷 >> 综合 >> Leetcode 198. 打家劫舍(DAY 41) ---- 动态规划学习期
  详细解决方案

Leetcode 198. 打家劫舍(DAY 41) ---- 动态规划学习期

热度:100   发布时间:2023-11-17 20:12:05.0

文章目录

    • 原题题目
    • 代码实现(首刷自解)
    • 代码实现(二刷DAY 93 C++ 自解)
    • 代码实现(三刷自解 DAY 157 C++)
    • 代码实现(四刷自解 DAY 243 C++)
    • 代码实现(五刷自解 DAY 295 C++)
    • 代码实现(五刷自解 含输出路径 DAY 295 C++)
    • 代码实现(六刷自解 DAY 9 Golang)


原题题目


在这里插入图片描述


代码实现(首刷自解)


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

代码实现(二刷DAY 93 C++ 自解)


class Solution {
    
public:int rob(vector<int>& nums) {
    int ret = -1,size = nums.size();vector<int> dp(size+1,0);for(int i=0;i<size;++i){
    dp[i] = nums[i];if(i==1)    dp[i] = max(dp[i],dp[i-1]);if(i>=2)    dp[i] = max(dp[i-2]+nums[i],dp[i-1]);ret = max(ret,dp[i]);}return ret;}
};

代码实现(三刷自解 DAY 157 C++)


class Solution {
    
public:int rob(vector<int>& nums) {
    if(nums.size() == 1)    return nums[0];for(int i=2;i<nums.size();++i){
    if(i == 2) nums[i] += nums[0];else       nums[i] += max(nums[i-2],nums[i-3]);}return max(nums[nums.size()-1],nums[nums.size()-2]);}
};

代码实现(四刷自解 DAY 243 C++)


class Solution {
    
public:int rob(vector<int>& nums) {
    int ans = 0,size = nums.size();vector<int> dp(size,0);for(int i = 0;i < size;++i){
    dp[i] = max((i >= 2 ? dp[i - 2] : 0) + nums[i],(i >= 1 ? dp[i - 1] : 0));ans = max(ans,dp[i]);}return ans;}
};

代码实现(五刷自解 DAY 295 C++)


class Solution {
    public:int rob(vector<int>& nums) {
    vector<int> dp(nums.size(), 0);int ret = nums[0];dp[0] = nums[0];if (nums.size() >= 2) {
    ret = max(ret, nums[1]);dp[1] = ret;}for (int i = 2; i < dp.size(); ++i) {
    dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);ret = max(ret, dp[i]);}return ret;}
};

代码实现(五刷自解 含输出路径 DAY 295 C++)


class Solution {
    public:int rob(vector<int>& nums) {
    vector<pair<int, int>> dp(nums.size());int ret = nums[0];dp[0].first = nums[0];dp[0].second = -1;if (nums.size() >= 2) {
    if (nums[1] > nums[0]) {
    dp[1].first = nums[1];dp[1].second = -1;} else {
    dp[1].first = nums[0];dp[1].second = -1;}}for (int i = 2; i < dp.size(); ++i) {
    if (dp[i - 2].first + nums[i] > dp[i - 1].first) {
    dp[i].first = dp[i - 2].first + nums[i];dp[i].second = i - 2;} else {
    dp[i].first = dp[i - 1].first;dp[i].second = i - 1;}ret = max(ret, dp[i].first);}int pos = dp.size() - 1;while (pos != -1) {
    int nextpos = dp[pos].second;if (!nums[pos] || nextpos == -1 || dp[pos].first != dp[nextpos].first) {
    cout << nums[pos] << " -> ";}pos = nextpos;}return ret;}
};

代码实现(六刷自解 DAY 9 Golang)


func max(x, y int) int {
    if x >= y {
    return x} else {
    return y}
}func rob(nums []int) int {
    if len(nums) == 1 {
    return nums[0]}if len(nums) == 2 {
    return max(nums[0], nums[1])}pre1, pre2 := nums[1], nums[0]now := max(pre1, pre2)for i := 2; i < len(nums); i++ {
    now = max(pre2 + nums[i], pre1)pre2, pre1 = max(pre2, pre1), now}return now
}