「代码随想录算法训练营」第三十四天 | 动态规划 part7

news/2024/11/16 21:36:29/文章来源:https://www.cnblogs.com/frontpen/p/18351952

198. 打家劫舍

题目链接:https://leetcode.cn/problems/house-robber/
文章讲解:https://programmercarl.com/0198.打家劫舍.html
题目难度:中等
视频讲解:https://www.bilibili.com/video/BV1Te411N7SX
题目状态:有点思路但不全。

思路:

这次的dp[i]数组表示在到第i个房间中时最多的偷盗金额,而到第i个房间的时候,我们有两个策略,①偷这一家;②不偷这一家。

① 偷这一家,那么我们就不能偷前一家了(i-1),因此此时的金额数量为dp[i - 2] + nums[i];
② 不偷这一家,那么我们就按照之前的策略了,也就是dp[i - 1]的金额。

因此我们的递归dp公式就出来了:dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);

所以我们要初始化两个数,

  • dp[0] = 0
  • dp[1] = max(nums[0], nums[1])

代码:

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

213. 打家劫舍 II

题目链接:https://leetcode.cn/problems/house-robber-ii/
文章讲解:https://programmercarl.com/0213.打家劫舍II.html
题目难度:中等
视频讲解:https://www.bilibili.com/video/BV1oM411B7xq
题目状态:😭

思路:

这是一个环状的居民区,因此我们要考虑下面这几种情况:

① 偷第一个不偷最后一个

image

② 偷最后一个不偷第一个

image

这两种情况的单个代码逻辑和上一题是一样的,最后我们只需要判断这两种情况所获得的金额哪个大就行。

代码:

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

337. 打家劫舍III

题目链接:https://leetcode.cn/problems/house-robber-iii/
文章讲解:https://programmercarl.com/0337.打家劫舍III.html
题目难度:中等
视频讲解:https://www.bilibili.com/video/BV1H24y1Q7sY
题目状态:😭

思路:

动规数组中包含两个元素,dp[0]表示当前节点不偷,dp[1]表示当前节点偷。然后使用递归后序遍历这个二叉树。

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int rob(TreeNode* root) {vector<int> res = robTree(root);return max(res[0], res[1]);}vector<int> robTree(TreeNode *cur) {if(cur == nullptr) return vector<int>{0, 0};vector<int> left = robTree(cur->left);vector<int> right = robTree(cur->right);// 偷当前节点int val1 = cur->val + left[0] + right[0];// 不偷当前节点int val2 = max(left[0], left[1]) + max(right[0], right[1]);return {val2, val1};}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780723.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷 P2731 骑马修栅栏 Riding the Fences之欧拉路径板子

洛谷P2731题解传送锚点摸鱼环节 [USACO3.3] 骑马修栅栏 Riding the Fences 题目背景 Farmer John 每年有很多栅栏要修理。他总是骑着马穿过每一个栅栏并修复它破损的地方。 题目描述 John 是一个与其他农民一样懒的人。他讨厌骑马,因此从来不两次经过一个栅栏。 John 的农场上…

运用Npcap库实现SYN半开放扫描

Npcap 是一款高性能的网络捕获和数据包分析库,作为 Nmap 项目的一部分,Npcap 可用于捕获、发送和分析网络数据包。本章将介绍如何使用 Npcap 库来实现半开放扫描功能。TCP SYN 半开放扫描是一种常见且广泛使用的端口扫描技术,用于探测目标主机端口的开放状态。由于这种方法并…

js模拟Sleep/Delay

原文链接 https://www.51cto.com/article/767574.html 我的总结 看上去比较好的方式: 1.用递增的setTimeOut。 2.用async/await。 最后结论截图 翻译 搜索 复制

支付三大黑盒之二支付引擎

支付系统有三大黑盒“清结算对账、支付引擎和账务系统”,之所以说是黑盒一来是因为他们深藏后台很少被人看到,二来是有会计知识的门槛。这篇文章就用尽可能大白话的语言来介绍三个黑盒之一的“支付引擎”。 一、什么是支付引擎 支付引擎又被称为支付核心,他是支付系统的后台…

你觉得大模型时代该出现什么?

大模型的概念都火了两年了,之前各种媒体吹嘘大模型的出现是类似“蒸汽机时代”、“iPhone时刻”等等。那为什么我们期待的结果都没出现呢?咱们先一起回顾下历史。大模型的概念都火了两年了,之前各种媒体吹嘘大模型的出现是类似“蒸汽机时代”、“iPhone时刻”等等。那为什么…

鸿蒙(HarmonyOS)实现隐私政策弹窗

在实现用户协议弹窗时,通常我们会想到使用系统自定义弹窗,并在弹窗中点击跳转到Web页面。但在HarmonyOS中,由于系统弹窗的显示优先级高于其他组件,即使跳转到Web页面,弹窗依然会显示在最上层。 为了解决这个问题,我们可以自定义一个组件来模拟弹窗,这样当跳转到Web页面时…

软件测试常见术语-几万万人的钉钉、微信软件测试群

3 术语和定义 在本文档中,以下术语和定义适用。 ISO、IEC 和 IEEE 在以下地址维护标准化中使用的术语数据库:ISO 在线浏览平台:https://www.iso.org/obp/ui IEC 电子百科全书:网址:https://www.electropedia.org/ IEEE 在线标准词典:https://ieeexplore.ieee.org/browse/…

dotnet C# 分享基础 for 循环的写法

本文将来和大家聊聊在 dotnet C# 里面的基础的 for 循环语法的写法使用 for 作为循环的写法是在编程里面常用的代码写法。比如说我有一个名为 Foo 的类型,这个类型提供了一个名为 GetCount 的方法,这个方法可以缓慢的获取 Foo 里面的一个代表数量的值。且在 Foo 类型里面提供…

dotnet C# 使用 SHFileOperation 调用 Win32 的文件复制对话框

本文将和大家介绍如何在 dotnet C# 里面使用 SHFileOperation 调用 Windows 自带的文件复制对话框进行文件复制本文核心代码拷贝自 C#中使用SHFileOperation调用Windows的复制文件对话框 - 季风哥 - 博客园 文章,特别感谢大佬提供的方法 实现的效果图如下详细实现逻辑还请大家…

Avalonia 11.1 已知问题 应用启动时 PointToScreen 无法获取正确坐标

本文记录 Avalonia 11.1 版本的已知问题,在 Linux 上使用 X11 时,在应用启动时,即使在 Loaded 或 Activated 事件里,都无法使用 PointToScreen 获取到正确的屏幕坐标,只会将传入的点作为返回值此问题已经报告给 Avalonia 官方,请看 https://github.com/AvaloniaUI/Avalon…

乌龟对对碰开局应该抽几只?

结论:30只以上为佳,3的倍数 https://www.bilibili.com/video/BV17nYVekEWU/?vd_source=9b97428fe30142d2bb4f9bab6ef082a4# Import necessary libraries import numpy as np import random from collections import defaultdict import matplotlib.pyplot as plt# Function …

写一个cpp uos系统

#include <iostream>int main() {std::cout << "Hello, UOS!" << std::endl;return 0; }创建一个test.cpp文件, 在当前目录打开终端, 把上面代码内容写里面, 输入g++ test.cpp, 生成了一个a.out文件, ./a.out 输出 Hello, UOS!