算法——动态规划(新)

什么是动态规划?

动态规划算法的基本思想-求解步骤-基本要素和一些经典的动态规划问题【干货】-CSDN博客

一、三步问题

面试题 08.01. 三步问题 - 力扣(LeetCode)

思路

我们要知道,走楼梯,前三个阶梯步数已经知道,那我们若是想走到第四楼,还需要一个个推吗?

走到4层,我们有三种方法

1.从一楼出发,这样只需要走3层即可。

2.从二楼出发,这样只需要走2层即可。

3.从三楼出发,这样只需要走1层即可。

所以在此问题中,我们要找到到达n个阶梯时,离n个阶梯最近的n-1,n-2,n-3的阶梯的最短路径。并且以此来递推出走到第n个阶梯的最短距离。

代码

 int waysToStep(int n) {
        const int MOD=1e9+7;
        if(n==1||n==2) return n;
        if(n==3) return 4;
        vector<int> dp(n+1);
        dp[1]=1,dp[2]=2,dp[3]=4;
        for(int i=4;i<=n;i++)
        {
            dp[i]=((dp[i-1]+dp[i-2])%MOD+dp[i-3])%MOD;
        }
        return dp[n];
    }

二、使用最小花费爬楼梯

LCR 088. 使用最小花费爬楼梯 - 力扣(LeetCode)

思路

这也是个动态规划的题目,从底层楼梯爬到最上层,那我们建立表呢?

——设一个dp表,dp[i]表示到第i层需要花费的最少的钱。

由于付一次钱,就可以爬一层或者两层楼梯,所以我们需要比较的是到第i-1层和到第i-2层最小的值————min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]) 因此这就是我们的状态转移方程。

状态转移方程就是要把握到达每一步的值从哪里来?——然后比较出最小的那一步的值,依次类推,最后得出到达第i层最小的值。

代码

int minCostClimbingStairs(vector<int>& cost) {
        int len=cost.size();
        vector<int> dp(len+1);
        if(len==1) return cost[0];
        if(len==2) return min(cost[0],cost[1]);//返回两个中的最小值
        dp[0]=0,dp[1]=0;
        for(int i=2;i<=len;i++)
        {
            dp[i]=min(cost[i-1]+dp[i-1],dp[i-2]+cost[i-2]);
        }
        return dp[cost.size()];
    }

三、解码方法

91. 解码方法 - 力扣(LeetCode)

思路

这里我们知道判断就只有两个,一个是单个数字,一个是两个数字,所以我们也可以按照动态规划的方式,由第n-1个和第n-2个推出第n个的值。

代码

int numDecodings(string s) {
        int n=s.size();
        vector<int> dp(n+1);
        dp[0]=1;
        for(int i=1;i<=n;i++)
        {
            if(s[i-1]!='0') dp[i]+=dp[i-1];//单个字母不为0,那么就往上加,一个字母就往前加一个
            if(i>1&&s[i-2]!='0'&&(s[i-2]-'0')*10+(s[i-1]-'0')<=26) dp[i]+=dp[i-2];//两个字母就加前两个的
        }
        return dp[n];
    }

四、不同路径

LCR 098. 不同路径 - 力扣(LeetCode)

思路

首先,我们知道,只能向右或者向下行走,那么我们可以通过动态规划得出转移方程

dp[i][j]=dp[i][j-1]+dp[i-1][j],其中dp表代表的是到达i处的路径数。

初始化呢?——第一行和第一列都只有1,然后通过状态转移方程即可得出最后一个位置的值,也就是打到终点的路径数。

代码

int uniquePaths(int m, int n) {
	vector<vector<int>> dp(m, vector<int>(n));
    if(m==1&&n==1)
        return 1;
	for (int i = 1; i < n; i++)
	{
		dp[0][i] = 1;
	}
	for (int i = 1; i < m; i++)
	{
		dp[i][0] = 1;
	}
	for (int i = 1; i < m; i++)
		for (int j = 1; j < n; j++)
			dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
	return dp[m - 1][n - 1];
}

五、不同路径II

63. 不同路径 II - 力扣(LeetCode)

思路

思路和不同路径的思路一样,只不过需要判断障碍物的位置,若是有障碍物,那么就直接将障碍物所在的dp表的值定为0,表明到此位置的路径数为0,无法到达。

代码

 int numDecodings(string s) {
        int n=s.size();
        vector<int> dp(n+1);
        dp[0]=1;
        for(int i=1;i<=n;i++)
        {
            if(s[i-1]!='0') dp[i]+=dp[i-1];//单个字母不为0,那么就往上加,一个字母就往前加一个
            if(i>1&&s[i-2]!='0'&&(s[i-2]-'0')*10+(s[i-1]-'0')<=26) dp[i]+=dp[i-2];//两个字母就加前两个的
        }
        return dp[n];
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git分支详解

文章目录 一、分支1.1 查看本地分支1.2 创建本地分支1.3 切换分支&#xff08;checkout&#xff09;1.1 合并分支&#xff08;merge&#xff09;1.1 删除分支 二、解决冲突三、实际开发中分支使用原则和流程四、案例&#xff1a;创建并切换到dev01分支&#xff0c;在dev01分支提…

计算机网络期末复习(知识点)

一、计算机网络体系结构 计算机网络&因特网&#xff1a; 计算机网络定义&#xff1a;将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络关联软件及网络协议的管理和协调下&#xff0c;实…

软件测试技术之地图导航的测试用例

外观测试 屏幕显示不能有花屏、黑点和闪屏&#xff0c;清晰度、亮度、颜色要正常。 检测所有按键都能起到相应作用&#xff0c;是否手感不良。 UI显示状态、颜色、清晰度、效果。 控制&#xff1a;放大&#xff0c;缩小&#xff0c;音量调节功能测试。 交叉路口查询测试&am…

AIGC实战 - 使用变分自编码器生成面部图像

AIGC实战 - 使用变分自编码器生成面部图像 0. 前言1. 数据集分析2. 训练变分自编码器2.1 变分自编码器架构2.2 变分自编码器分析 3. 生成新的面部图像4. 潜空间算术5. 人脸变换小结系列链接 0. 前言 在自编码器和变分自编码器上&#xff0c;我们都仅使用具有两个维度的潜空间。…

【算法挨揍日记】day28——413. 等差数列划分、978. 最长湍流子数组

413. 等差数列划分 413. 等差数列划分 题目描述&#xff1a; 如果一个数列 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该数列为等差数列。 例如&#xff0c;[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums…

性能测试学习——项目环境搭建和Jmete学习二

项目环境搭建、Jmeter学习二 环境的部署虚拟机的安装虚拟机中添加项目操作步骤 使用环境的注意事项Jmeter的安装和简单使用Jemter的使用的进阶Jemter元件 Jmeter属性执行顺序和作用域作用域以自定义用户变量和用户参数(前置处理器)为例如何解决用户变量和线程组同级时&#xff…

Node.js之TCP(net)

Hi I’m Shendi Node.js之TCP&#xff08;net&#xff09; 最近使用Nodejs编写程序&#xff0c;需要用到自己编写的分布式工具&#xff0c;于是需要将Java版的用NodeJs重新写一遍&#xff0c;需要使用到TCP通信&#xff0c;于是在这里记录下Node.js TCP 的使用方法 依赖 需要使…

c语言-输入输出详解

文章目录 格式化输入输出占位符printfscanf 字符串输入输出puts&#xff08;&#xff09;gets&#xff08;&#xff09; 字符输入输出putchar&#xff08;&#xff09;getchar&#xff08;&#xff09; 区别 格式化输入输出 输入输出的库函数的头文件&#xff1a; #include<…

动态规划专项---最长上升子序列模型

文章目录 怪盗基德的滑翔翼登山合唱队形友好城市最大上升子序列和拦截导弹导弹防御系统最长公共上升子序列 一、怪盗基德的滑翔翼OJ链接 本题思路:本题是上升子序列模型中比较简单的模型&#xff0c;分别是从前往后和从后往前走一遍LIS即可。 #include <bits/stdc.h>co…

Linux——编译器gcc/g++、调试器gdb以及自动化构建工具makefilemake详解

编译器—gcc/g、调试器—gdb以及自动化构建工具—makefile&&make 文章目录 编译器—gcc/g、调试器—gdb以及自动化构建工具—makefile&&make1. 编译器——gcc/g1.1 生成可执行文件与修改默认可执行文件1.2 程序的翻译过程以及对应的gcc选项1.2.1 预处理 gcc -E…

边缘计算是如何为元宇宙提供动力的?

构建元宇宙虚拟世界并不简单&#xff0c;也并不便宜&#xff0c;但是还是有许多大型公司正在转移大量资源来开发他们的元宇宙业务&#xff0c;当然大部分企业注意力都围绕着 VR 耳机、AR 眼镜、触觉手套和其他沉浸式虚拟现实体验所需的可穿戴硬件。虽然这种沉浸式的体验是最终结…

【Django使用】django经验md文档10大模块。第4期:Django数据库增删改查

Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能强大的第三方插件&#xff0c;你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展…

WSL 2 更改默认安装的 Linux 发行版

目录 什么是 WSL 2&#xff1f;更改默认安装的 Linux 发行版更改发行版的 WSL 版本 什么是 WSL 2&#xff1f; WSL 2 是适用于 Linux 的 Windows 子系统体系结构的一个新版本&#xff0c;它支持适用于 Linux 的 Windows 子系统在 Windows 上运行 ELF64 Linux 二进制文件。 它的…

nn.KLDivLoss,nn.CrossEntropyLoss,nn.MSELoss,Focal_Loss

KL loss&#xff1a;https://blog.csdn.net/qq_50001789/article/details/128974654 https://pytorch.org/docs/stable/nn.html 1. nn.L1Loss 1.1 公式 L1Loss: 计算预测 x和 目标y之间的平均绝对值误差MAE, 即L1损失&#xff1a; l o s s 1 n ∑ i 1 , . . . n ∣ x i…

leetcode算法之分治-快排

目录 1.颜色分类2.排序数组3.数组中的第k个最大元素4.最小的k个数 1.颜色分类 颜色分类 class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int left -1,rightn,i0;while(i<right){if(nums[i] 0) swap(nums[left],nums[i]);e…

Spring的后处理器

目录 引言 BeanFactoryPostProcessor 注意 BeanPostProcessor 引言 Spring的后处理器是spring对外开发的重要扩展点&#xff0c;允许我们介入到Bean的整个实例化流程来&#xff0c;以达到动态注册BeanDefintion&#xff0c;动态修改BeanDefintion&#xff0c;以及动态修改Be…

【Android】使用Retrofit2发送异步网络请求的简单案例

添加网络权限到AndroidManifest.xml清单文件 为了让你的Android应用程序能够使用互联网进行通信&#xff0c;你需要在AndroidManifest.xml文件中添加网络权限声明。<uses-permission android:name"android.permission.INTERNET"/> 这个权限应该添加到 Android…

laravel-admin导出excel全部,表中无id列导出失败

laravel-admin导出excel时&#xff0c;导出全部数据&#xff0c;但是表中没有id字段&#xff0c;然后就无法导出excel&#xff1b; 就直接显示 一开始我也很着急&#xff0c;弄了半天还是不行&#xff0c;然后重写还是有问题 最后发现底层代码排序是按照id排序的orderBy(id, a…

音视频技术在手机上的应用与挑战

// 编者按&#xff1a;随着手机相机功能日益强大&#xff0c;4k&#xff0c;8k&#xff0c;各类特色短视频的拍摄&#xff0c;编辑、播放需求日益增长&#xff0c;短视频应用的火爆也对当前的手机音视频技术提出了更高的要求&#xff0c;如何更好地提高用户体验成为了行业共同…

Android 13 - Media框架(14)- OpenMax(二)

这一节我们将来解析 media.codec 这个 HIDL service 究竟提供了什么服务&#xff0c;服务是如何启动的。 1、main 函数 我们先来看 frameworks/av/services/mediacodec/main_codecservice.cpp&#xff1a; int main(int argc __unused, char** argv) {strcpy(argv[0], "…