【董晓算法】动态规划之线性DP问题

 前言:

本系列是看的B站董晓老师所讲的知识点做的笔记

董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com)

树塔-记忆化搜索

特点(前提):从上向下的累加和是不能重复使用的,从下向上的累加和是可以重复使用的

把题目变成二叉树的形式:4的左子树分别是下一行的8和下一行右边的3,依次类推,每一个树的左子树都是他的下一行的数和下一行数的右边的那个数

int a[9][9] =
{   {1},{4,6},{8,3,9},{5,7,2,1}};int n = 4;int f[9][9];//记录从上向下的累加和int dfs(int x, int y){if (f[x][y] != 0) return f[x][y];//说明该点已经遍历过if (x == n - 1) f[x][y] = a[x][y];//说明已经全部遍历完了elsef[x][y] = a[x][y] + max(dfs(x + 1, y), dfs(x + 1, y + 1));return f[x][y];}

线性DP

数塔

int calu(int x, int y)
{int x,  y;for (x = n - 2; x >= 0; x--)for (y = 0; y <= x; y++)//这样就可以弄成塔的形式a[x][y] += max(a[x + 1][y], a[x + 1][y + 1]);cout << "max=" << a[x][y];
}

如果需要输出路径的话,需要有一个前驱路径数组p[x][y]和一个备份数组b[x][y];

前驱路径数组主要是记录y的增值的,把两种情况(a[x + 1][y]>/<=a[x + 1][y + 1])分别设为0和1,r然后在通过遍历数组b[x][y],y=y+p[x][y]进行输出

最长上升子序列

B3637 最长上升子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

动态规划(O(n²))

for (int i = 1; i <= n; i++) f[i] = 1;//把初始化化长度都设为1for (int i = 2; i <= n; i++){for (int j = 1; j < i; j++)if (a[i] > a[j]) f[i] = max(f[j] + 1,f[i]);//分别依次计算不同下标时候的长度for (int i = 1; i <= n; i++) ans = max(ans, f[i]);//遍历寻找长度最长的长度}

二分查找

思想:

新进来一个元素a[i]:
(1)大则添加:如果a[i]大于b[len],直接让b[++len]=a[i]。即b数组的长度增加1,而且添加了一个元素。

(2)小则替换:如果a[i]小于或等于b[len],就用a[i]替换掉b数组中第一个大于或等于a[i]的元素。
    假设第一个大于a[i]的元素是b[j],那么用a[i]换掉b[j]后,会使得b[1...j]这个上升子序列的结尾元素更小。对于一个上升子序列,其结尾元素越小,越有利于续接其它元素,也就越可能变得更长。

注意:

b数组不是存储的最长上升子序列,但是子序列的长度相同

 核心代码

二分查找第一个大于等于x的位置

int find(int x) {int l = 1, r = len, mid;while (l <= r) {int mid = l + r >> 1;if (x > b[mid]) l = mid + 1;else r = mid - 1;}return l;
}

新增元素代码

for (int i = 0; i < n; i++) {if (b[len] < a[i]) b[++len] = a[i];else b[find(a[i])] = a[i];}

全部代码

#include<iostream>
using namespace std;
const int N = 10010;
int n, a[N], b[N], len;
int find(int x) {int l = 1, r = len, mid;while (l <= r) {int mid = l + r >> 1;if (x > b[mid]) l = mid + 1;else r = mid - 1;}return l;
}
int main() {scanf("%d", &n);for (int i = 0; i < n; i++) scanf("%d", &a[i]);b[0] = -2e9;for (int i = 0; i < n; i++) {if (b[len] < a[i]) b[++len] = a[i];else b[find(a[i])] = a[i];}printf("%d\n", len);return 0;
}

最长公共子序列 

1.最长公共子序列不是连续的一段区间

2.记录路径的时候前驱数组可以去掉

1.思路

2.核心代码

 for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)if (a[i] == b[j]) f[i][j] = f[i - 1][j - 1] + 1;else f[i][j] = max(f[i - 1][j - 1], max(f[i - 1][j], f[i][j - 1]));

3.题目一

P1439 【模板】最长公共子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 

前提:

两个排列都是1到n的排列,说明元素都是相同的只是顺序不同,

思路:

把LCS转换成LIS 

原因:

通过离散化可以得到一个性质。

离散化步骤:

A:3 2 1 4 5
B:1 2 3 4 5
重新把A,B数组中的元素替换掉,使得A数组是其次递增的

标个号:把3标成a,把2标成b,把1标成c.…于是变成:
A: a b c d e

B: c b a d e
结论:最长公共子串的长度不会改变,又因为A数组是递增的,所以说在B数组中递增的子序列就是A的子序列

离散化代码:
for (int i = 1; i <= n; i++){cin >> m;line[m] = i;}

最长公共子串

核心代码

for(int i=1; i<=strlen(a); i++){for(int j=1; j<=strlen(b); j++){if(a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1]+1;else f[i][j]=0;if(f[i][j]>max)max=f[i][j];}

编辑距离

题目

P2758 编辑距离 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

二维思路

一维思路

具体分析

1.初始化,看上面的矩阵,第一行的意思是“LOVER"此时是空串,则“NOTV”那里有几个字符就需要删除几个字符

 for(int i=1;i<=la;i++) f[i][0]=i;for(int i=1;i<=lb;i++) f[0][i]=i;

2. 一维思路如果不清楚的话,就对照着图片上方的四个格子推一次

总结:

1.LIS:Longest Increasing Subsequence    最长递增子序列

LCS:Longest Common Subsequence  最长公共子序列

2.公共子串:字符必须是连续相等的;

公共子序列:字符必须是相等的,可以不连续。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

结合小波变换的遥感语义分割网络,融合频域和空间域特征提升分割效果

题目:SFFNet: A Wavelet-Based Spatial and Frequency Domain Fusion Network for Remote Sensing Segmentation 论文:http://arxiv.org/abs/2405.01992 代码:https://github.com/yysdck/SFFNet 年份:2024 创新点 两阶段网络SFFNet:网络首先使用空间方法提取特征,以保…

2024中国应急(消防)品牌巡展西安站成功召开!惊喜不断

消防品牌巡展西安站 5月10日&#xff0c;由中国安全产业协会指导&#xff0c;中国安全产业协会应急创新分会、应急救援产业网联合主办&#xff0c;陕西消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-西安站成功举办。该巡展旨在展示中国应急&#xff08;消防&am…

四、基于Stage模型的应用架构设计

前面我们了解了如何构建鸿蒙应用以及开发了第一个页面&#xff0c;这只是简单的demo&#xff1b;那么如何去设计&#xff0c;从0到1搭建一个真正的应用呢 一、基本概念 1、Stage模型基本概念 Stage模型概念图 AbilityStage&#xff1a;是一个Module级别的组件容器&#xff0…

GPT-4o、GPT-4国内可用!新UI界面率先体验方法!

测试情况&#xff1a; 现根据测试结果&#xff0c;先对比一下普号4o和付费的区别&#xff1a; 注&#xff1a; plus限制情况&#xff1a;4的次数用完后可以用4o&#xff0c;但4o的80条用完后不能用4&#xff1b; team账户限制是100条/3h&#xff0c;4o和4共享额度 目前发现的…

vs2022中添加头文件和声明

总结帖 数组存储 matlab中3维数组–>C中1维数组 数组转置函数 #include <stdio.h>// 转置二维数组 void transpose(int *src, int *dest, int rows, int cols) {for (int i 0; i < rows; i) {for (int j 0; j < cols; j) {dest[j * rows i] src[i * col…

【ARMv8/v9 系统寄存器 6 -- EL 异常等级判定寄存器 CurrentEL 使用详细将介绍】

文章目录 ARMv8/v9 EL 等级获取EL 等级获取函数实现EL 等级获取测试 ARMv8/v9 EL 等级获取 下面这个宏定义是用于ARMv8/v9架构下&#xff0c;通过汇编语言检查当前执行在哪个异常级别&#xff08;Exception Level&#xff0c;EL&#xff09;并据此跳转到不同的标签。 异常级别…

java代码混淆工具ProGuard混淆插件

java代码混淆工具ProGuard混淆插件 介绍 ProGuard是一个纯java编写的混淆工具&#xff0c;有客户端跟jar包两种使用方式。可以将程序打包为jar&#xff0c;然后用工具进行混淆&#xff0c;也可以在maven中导入ProGuard的插件&#xff0c;对代码进行混淆。 大家都知道 java代…

Edwards爱德华PHM3000培训PPT课件内容可见图片详情

Edwards爱德华PHM3000培训PPT课件内容可见图片详情

Linux 第三十四章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

穷人翻身的秘诀!2024年普通人如何创业赚钱?穷人如何逆袭翻身?普通人创业新风口?

穷人的思维有一个致命的缺陷&#xff0c;就是追求确定性&#xff0c;进而失去了可能性。而赚钱的真相实际上非常残酷。世界上能够赚钱的事情必定是不确定的&#xff0c;能够赚取巨额财富的事情更是极度不确定的。只有面对不确定性&#xff0c;才能让你把竞争对手拦在门外&#…

pandas style添加表格边框,或是只添加下边框等自定义边框样式设置

添加表格边框 可以使用如下程序添加表格&#xff1a; import dataframe_image as dfi import pandas as pd import numpy as npdf pd.DataFrame(np.random.random(size(10, 5))) df_style df.style.set_properties(**{text-align: center,border-color: black,border-width…

幻兽帕鲁Palworld服务器手动+docker部署方法+备份迁移

目录 帕鲁部署官方文档帕鲁手动安装法手动安装steamcmd通过steamcmd安装帕鲁后端 docker容器一键部署幻兽帕鲁绿联云NAS机器部署幻兽帕鲁客户端连接附录1&#xff1a;PalServer.sh的启动项附录2&#xff1a;配置文件游戏存档保存和迁移 关于阿里云计算巢 帕鲁部署官方文档 htt…

汇聚荣科技:如何有效为拼多多店铺引流?

在电商竞争激烈的今天&#xff0c;为拼多多店铺引流是每个店主必须面对的挑战。有效的引流策略不仅能增加店铺曝光度&#xff0c;还能提升转化率&#xff0c;促进销量增长。 一、社交媒体营销 利用微信、微博等社交平台进行推广&#xff0c;可以通过发布产品信息、用户评价和促…

苹果电脑里面的资料为什么不能拷贝到硬盘 mac硬盘权限限制怎么解决 mac东西拷不进硬盘怎么办

你在使用Mac电脑的时候有没有遇到过文件无法拷贝的情况呢&#xff1f;这种情况多见于Mac电脑使用U盘或者移动硬盘的时候&#xff0c;不少用户都发现&#xff1a;可以正常读取U盘里的数据但是无法拷贝文件进去&#xff0c;为什么会有这种情况呢&#xff1f; 一、mac东西拷不进硬…

有什么泛域名ssl证书260

互联网发展快速&#xff0c;不管是个人还是企事业单位都开始利用互联网营利&#xff0c;因此越来越多的用户开始使用数字证书加密客户端与服务器之间的传输数据&#xff0c;从而防止传输数据被截取或篡改。发展到现在&#xff0c;不论是个人还是企事业单位用户往往经营了不止一…

大数据比赛-环境搭建(二)

一、ubuntu安装google 1、下载google的Linux安装版 链接&#xff1a;https://pan.baidu.com/s/1w4Hsa1wbJDfC95fX2vU_1A 提取码&#xff1a;xms6 或者&#xff1a;Google Chrome 64bit Linux版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒 (chromedownloads.net) …

postman 请求上传文件,post请求携带文件,以及对应postMapping 处接收写法

一、postman 处表单携带文件的方式 先要修改content-type 必须改&#xff0c;否则不支持 Content-Type multipart/form-dataBody 表单处 二、JavaWeb PostMapping 处接收的写法 不要带 RequestBody 不要带 RequestBody 不要带 RequestBody PostMapping(value "/imp…

串,数组和广义表

2.1.求next和nextval的实现 代码&#xff1a; int next_one(char *str, int len) {int result 1;if(len 1 || len 0) return len;for (size_t i 1; i < len; i){ if(compare(str, strlen-i, i)) {result i1;//break;}}return result; }int next(char *str, int *…

【JAVA】嵌入式软件工程师-2025校招必备-详细整理

一、Java 基础 1.JDK 和 JRE 有什么区别&#xff1f; jdk&#xff1a;java development kit jre&#xff1a;java runtime Environment jdk是面向开发人员的&#xff0c;是开发工具包&#xff0c;包括开发人员需要用到的一些类。 jre是java运行时环境&#xff0c;包括java虚拟机…

2024年5月16日 十二生肖 今日运势

小运播报&#xff1a;2024年5月16日&#xff0c;星期四&#xff0c;农历四月初九 &#xff08;甲辰年己巳月庚辰日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;猴、鼠、鸡 需要注意&#xff1a;牛、兔、狗 喜神方位&#xff1a;西北方 财神方位&#xff1a;…