关于动态规划

news/2025/1/18 22:19:51/文章来源:https://www.cnblogs.com/Fwy040611/p/18678957

主要问题大概是动规基础(斐波那契),背包,打家劫舍,股票,子序列。
解决也主要是先分类,建立dp数组,明确dp数组的含义,dp数组的初始化,遍历顺序。
动规基础斐波那契数列,爬楼梯,建立dp数组的时候,递推公式的推导就要参考建立dp数组并且明确dp数组的含义
比如下面的最小花费爬楼梯,明确含义就可以在爬楼梯的原有递推公式上进行修改,在对应的部分添加上相应的花费就可以找到新的递推公式,动规的其他问题找递推公式也是在明确建立的dp数组的含义后进行对应的推导,从而得出相应的递推公式。
dp[i]=dp[i-2]+dp[i-1]
上到n阶的方法数为n-2阶加上n-1阶
dp[i] = fmin(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]
上到n阶的最小花费为第n-2阶的最小花费加上n-1阶的最小花费
递推公式中的加一减一之类的也是在明确了dp数组的含义之后才好定下来,在不同路径问题中比较明显
dp[i][j]=dp[i-1][j]+dp[i][j-1]
这里的i和j分别代表着网格中的列和行,对应的加减就代表着左右方向,加减的数量就表示了具体的格子坐标
dp数组的初始化也要视不同情况而定,像在不同路径中,对于行和列的初始化都是1,但是在不同路径Ⅱ中的初始化就要考虑到因为存在障碍物以及限制了方向,所以有些格子需要初始化为0,而不能完全的全都初始换为1.
遍历的顺序也要根据情况而定,主要是从前到后和从后向前,但有些特殊的问题两层循环的顺序也要考虑到。
在解决动规问题的过程中,最先想到的通常是暴力,但是很多时候会超限,然后递归也可能会超限,可以尝试着用记忆化搜索和递推方法还有滚动数组,这些方法可以大幅度的缩减所需要的时间和内存。
记忆化搜索实在递归的基础上添加了一个用于储存计算结果的功能,因为在某些问题当中使用递归会造成大量的重复运算,添加了这个功能之后就可以避免因重复计算导致的时间浪费。
例:leetcode LCR 127

这题中如果直接使用递归会导致超时,无法通过测试用例(如图)

这时候我们可以使用记忆化搜索的方式来节约时间
`#define MOD 1000000007

int trainWays(int num) {
if (num < 0) {
return 0;
}

int vis[num + 1];
for (int i = 0; i <= num; i++) {vis[i] = -1;
}int dfs(int n) {if (vis[n] != -1) {return vis[n];}if (n == 0 || n == 1) {return 1;}vis[n] = (dfs(n - 1) % MOD + dfs(n - 2) % MOD) % MOD;return vis[n];
}return dfs(num);

}`
例:leetcode 392


同样直接使用递归会导致超时(如下图)


下为使用滚动数组的方法

int longestCommonSubsequence(char* text1, char* text2) { int m = strlen(text1); int n = strlen(text2); int dp[2][n + 1]; for (int i = 0; i <= 1; i++) { for (int j = 0; j <= n; j++) { dp[i][j] = 0; } } int now = 0, pre = 1; for (int i = 1; i <= m; i++) { now = 1 - now; pre = 1 - pre; for (int j = 1; j <= n; j++) { if (text1[i - 1] == text2[j - 1]) { dp[now][j] = dp[pre][j - 1] + 1; } else { dp[now][j] = dp[pre][j] > dp[now][j - 1]? dp[pre][j] : dp[now][j - 1]; } } } return dp[now][n]; }

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

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

相关文章

强力工具助你一臂之力:XXECheck–全面提升XML安全,防护XXE漏洞!

泷羽Sec-trackXXECheck XXECheck 是一种用于检测和防止 XML 外部实体 (XXE) 注入攻击的安全工具或库,一款XXE漏洞检测工具,支持 DoS 检测(DoS 检测默认开启)和 DNSLOG 两种检测方式,能对普通 xml 请求和 xlsx 文件上传进行 XXE 漏洞检测。 源地址:https://github.com/Wei…

知乐

儒家理想境界追求心灵的安顿过程 孔颜之乐 曾点之乐 潘立勇教授在[宋明理学休闲审美哲学的内在张力]中的一段描述:[1]宁新昌.孔颜之乐与曾点气象——兼论儒家的自由境界[C]//中华炎黄文化研究会,广东炎黄文化研究会,暨南大学.“21世纪中华文化世界论坛”第五次国际学术研讨…

[ABC283E] Don‘t Isolate Elements

题目:思路: 很明显总的情况是2^h*w种,然后不难发现改变一行只会影响到相邻两行,也就是说前面的决策不会影响到后面的决策,只有当前面的决策全部合理才能走后一步。 所以取dp:dp[i][j][k]为前i行,j(当前行是1/0否改变),k(当前行的前一行是1/0否改变)。 所以有递推式:dp[i][j]…

在 nuget 私服 BaGet 中应用https 以及 gitea action runner 自动打包

最近赋闲,想起之前工作中代码管理的一点经历,就是在打包项目的时候,类库的版本号几乎没变过,一个项目运行多少年了,版本号还是1.0.0。😂 即使用到了 nuget 私服,基本上也是手动打包的,CI 工具基本都是用到 api 项目。于是想结合 gitea 的 CI 工具 act runner 试用一下…

记录一下双多控开关接法

实际上双控就是单刀双掷开关,多控就是双刀双掷开关。多控里L1A+L1B是输入的俩个接上级出来的俩根线,LA和LB是反着的接上总有一路能通。输入俩通道输出俩通道所以可以无限串联。实际上双控就是单刀双掷开关,多控就是双刀双掷开关。 多控里L1A+L1B是输入的俩个接上级出来的俩根…

Day 7

1月17日,继续看了一些SpringBoot视频, SpringBoot的实现步骤SpringBoot项目的起步依赖 <!-- springboot工程需要继承的父工程 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifac…

如果通过 vxe-table 实现 Excel,可以和 Excel、WPS 复制粘贴

如果通过 vxe-table 实现 Excel,可以和 Excel、WPS 复制粘贴 官网:https://vxetable.cn<template><div><vxe-gridref="gridRef"v-bind="gridOptions"@cell-area-selection-end="cellAreaSelectionEndEvent"@cell-area-extensio…

树(基础)

树 1 定义 1.1 树是什么 树是一种数据结构,因为形似倒着的树而得名. 1.2 树的定义 递归定义 1.2.1 有根树的定义 形象化的,如图1,有根树存在根节点这一定义,从根节点可以分出任意个分支,这任意个分支又可以继续细分,分出的节点称为“子节点”。抽象化的,树也是\(N\)…

Java五子棋源码联网版+Socket+Swing+大学生练手项目

前言 学Java的朋友们,福利来了,今天小编给大家带来了一款 Java五子棋源码联网版 源码,看图: 实现了服务端和客户端。是联网版游戏基础模型。环境 JDK1.8代码采用原生java类库编写,界面采用swing,完整源码获取地址: gitee.com/hadluo/java_game01.git整体代码结构服务器采…

Java源码:实现斗地主游戏+大学生练手项目

前言 学Java的朋友们,福利来了,今天小编给大家带来了一款 斗地主 源码,看图:视频演示效果 https://githubs.xyz/show/5.mp4 环境 JDK1.8代码采用原生java类库编写,界面采用swing,完整源码获取地址: gitee.com/hadluo/java_game01.git项目结构 代码十分简洁,只有简单的7个…

文件蜈蚣 后台偷跑流量

我已经好久没有打开这个软件了,期间重启了很多次,他有一个服务应该开机时就启动,后台偷跑流量 filec.exe文件。 因为我没什么什么上传流量也很大,最终定位到这个文件在偷跑了。

windows安装ffmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。 ffmpeg安装 打开 FFmpeg 官网,选择下载。 选择 Windows 平台,下面有两个链接,都是可以的,选择其一。 本文以点…