9.动态规划——4.最长公共子序列(动态规划类的算法题该如何解决?)

例题——最长公共子序列(一)

在这里插入图片描述

分析

设最长公共子序列 d p [ i ] [ j ] dp[i][j] dp[i][j] S 1 S_1 S1的前 i i i个元素,是 S 2 S_2 S2的前 j j j个元素,那么有:

  • S 1 [ i − 1 ] = = S 2 [ i − 1 ] S_1[i-1]==S_2[i-1] S1[i1]==S2[i1],那么 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j]=dp[i-1][j-1]+1 dp[i][j]=dp[i1][j1]+1
  • S 1 [ i − 1 ] ! = S 2 [ i − 1 ] S_1[i-1] !=S_2[i-1] S1[i1]!=S2[i1],那么 d p [ i ] [ j ] = m a x ( d p [ i ] [ j − 1 ] , d p [ i − 1 ] [ j ] ) dp[i][j]=max(dp[i][j-1],dp[i-1][j]) dp[i][j]=max(dp[i][j1],dp[i1][j])

代码

#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <climits>
//#include <bits/stdc++.h>
using namespace std ;
#define N 1001
int dp[N][N];int main(){int m,n;char s1[N];char s2[N];scanf("%d%d",&n,&m);scanf("%s%s",s1,s2);for (int i = 0; i <= n; ++i) {for (int j = 0; j <= m; ++j) {if (i==0||j==0){dp[i][j]=0;continue;}if (s1[i-1]==s2[j-1]){dp[i][j]=dp[i-1][j-1]+1;} else{dp[i][j] = max(dp[i-1][j],dp[i][j-1]);}}}printf("%d\n", dp[n][m]);return 0;
}

动态规划类的算法题该如何解决?

动态规划(Dynamic Programming,简称 DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。

解决动态规划类的算法题,一般遵循以下步骤:

  1. 理解问题:首先,需要完全理解问题的要求。这包括问题的输入、输出以及约束条件。对于动态规划问题,通常要找到问题的“状态”和“状态转移方程”。
  2. 定义状态:状态是描述问题在某个特定时刻的情况的变量或变量组。在动态规划中,我们需要找到一组状态,使得原问题的解可以由这些状态导出。每个状态都应该对应原问题的一个子问题。
  3. 寻找状态转移方程:状态转移方程描述了如何从较简单的子问题的解(即较小状态的值)推导出较复杂子问题的解(即较大状态的值)。这通常涉及对问题的数学建模。
  4. 初始化边界条件:对于动态规划问题,通常需要为最小的子问题(即边界状态)设定初始值。这些初始值通常是直接给出的,或者是通过简单计算得到的。
  5. 自底向上求解:根据状态转移方程和边界条件,从最小的子问题开始,逐步求解更大的子问题,直到求得原问题的解。这通常涉及使用循环或递归来遍历状态空间。
  6. 返回结果:当所有状态都被计算完毕后,原问题的解就是特定状态的值。这个状态通常是状态空间中的最大或最小状态,具体取决于问题的定义。

下面是一个简单的例子,说明如何应用这些步骤来解决动态规划问题:

例子:0-1背包问题

给定一组物品,每种物品都有自己的重量和价值。在限定的总重量内,我们如何选择,才能使得物品的总价值最大。

  1. 理解问题:有n个物品和一个容量为W的背包,每种物品i有重量weight[i]和价值value[i]。问题是如何选择物品放入背包,使得背包内物品的总价值最大。
  2. 定义状态:定义dp[i][j]为前i个物品中选取若干个放入容量为j的背包中所能获得的最大价值。
  3. 寻找状态转移方程:对于第i个物品,我们有两种选择:放入背包或不放入背包。如果放入背包,则背包的剩余容量为j-weight[i],此时的价值为dp[i-1][j-weight[i]] + value[i];如果不放入背包,则价值为dp[i-1][j]。因此,状态转移方程为:dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i])。
  4. 初始化边界条件:当没有物品可选(即i=0)时,dp[0][j] = 0(因为没有任何物品可以放入背包);当背包容量为0时,无论有多少物品可选,dp[i][0] = 0(因为无法放入任何物品)。
  5. 自底向上求解:使用两层循环遍历所有状态。外层循环遍历物品(从1到n),内层循环遍历背包容量(从0到W)。在每个状态下,根据状态转移方程计算dp[i][j]的值。
  6. 返回结果:当所有状态都被计算完毕后,原问题的解就是dp[n][W],即前n个物品中选取若干个放入容量为W的背包中所能获得的最大价值。

通过遵循这些步骤,可以有效地解决大多数动态规划类的问题。当然,对于更复杂的问题,可能还需要一些额外的技巧和优化。

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

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

相关文章

MFC 获取程序版本信息

在 MFC 应用程序中&#xff0c;可以使用 GetFileVersionInfo 函数来获取程序版本信息。这个函数能够获取一个指定文件的版本信息&#xff0c;并将其存储在一个缓冲区中。然后&#xff0c;可以使用 VerQueryValue 函数来解析版本信息并提取所需的信息。 #include <afxver_.h&…

leetcode刷题-代码训练营-第7章-回溯算法1

回溯法模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff0c;撤销处理结果} }理解 从…

小林coding图解计算机网络|基础篇02|键入网址到网页显示,期间发生了什么?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a;小林coding网站通道 文章目录 孤单小弟——HTTP真实地址查询——DNS指南好帮手——协议栈可靠传输——TCP远程定位——IP两点传输——MAC出口——网卡送别者——交…

SpringAOP和AspectJ有什么关系 ?

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

Linux是什么,该如何学习

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Linux的起源与发展 2、Linux在现代计算机领域…

Golang 内存管理和垃圾回收底层原理(一)

一、这篇文章我们来聊聊Golang内存管理和垃圾回收&#xff0c;主要注重基本底层原理讲解&#xff0c;进一步实战待后续文章 1、这篇我们来讨论一下Golang的内存管理 先上结构图 从图我们来讲Golang的基本内存结构&#xff0c;内存结构可以分为&#xff1a;协程缓存、中央缓存…

Excel 粘贴回筛选后的单元格不能完全粘老是少数据 ,有些单元格还是空的

环境&#xff1a; excel2021 Win10专业版 问题描述&#xff1a; excel 粘贴回筛选后的单元格不能完全粘老是少数据 有些单元格还是空的 复制选择筛选后A1-A10单元格 &#xff0c;定位条件&#xff09;&#xff08;仅可见单元格&#xff09;来访问&#xff0c;或者你可以使用…

mybatis-plus 表字段存在关键字的处理办法

一、问题复现 当数据库表中字段出现关键字时&#xff0c;若不做其他处理&#xff0c;mybatis-plus的BaseMapper并不会做其他的处理&#xff0c;最终导致SQL执行时&#xff0c;抛出SQL 语法错误。示例如下&#xff1a; Java查询语句 QueryWrapper<User> userQuery new …

Kubernetes(k8s)核心资源解析:Pod详解

Kubernetes核心资源解析&#xff1a;Pod详解 1、什么是Pod&#xff1f;2、Pod 的组成3、Pod 如何管理多个容器4、Pod 的网络5、Pod 的存储方式6、Pod 的工作方式6.1 自主式 Pod6.2 监控和管理 Pod6.3 Pod 的创建流程 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

linux三剑客之流编辑器sed

sed&#xff08;stream editor&#xff09;是Linux和Unix系统中一个非常强大的文本处理工具。它主要用于对文本数据进行过滤和转换。sed 可以在不打开文件的情况下&#xff0c;直接对输入流进行操作&#xff0c;并且可以将结果输出到标准输出或文件。 基本语法&#xff1a; s…

C# Task任务详细讲解

Task基础讲解 在C#中&#xff0c;Task 是用于表示异步操作的类。它属于 System.Threading.Tasks 命名空间&#xff0c;并允许你以异步方式执行代码&#xff0c;从而不阻塞主线程。这对于I/O密集型操作&#xff08;如网络请求或文件读写&#xff09;或CPU密集型任务非常有用&am…

微信小程序——小程序和页面生命周期详解

小程序的生命周期 小程序的生命周期主要分为以下几个阶段&#xff1a; 创建&#xff08;onLoad&#xff09;&#xff1a; 当小程序启动时&#xff0c;或者从其他页面跳转到当前页面时&#xff0c;会触发 onLoad 生命周期函数。 这个阶段通常用于初始化页面数据&#xff0c;从服…

解锁动态规划:从斐波那契到高效算法

动态规划&#xff08;Dynamic Programming, DP&#xff09;是解决优化问题的一种算法策略&#xff0c;它将一个复杂问题分解为更小的子问题&#xff0c;通过解决子问题来逐步找到复杂问题的最优解。动态规划适用于有重叠子问题和最优子结构性质的问题。接下来&#xff0c;我们通…

windows下使用wget批量下载银河麒麟软件仓库中的软件包——Wget for windows

1.什么是wget? wget是一个强力方便的命令行下的下载工具,可以通过HTTP和FTP协议(两种最广泛的互联网协议)从因特网中检索并获取文件。 此外,wget还具有如下特点: 以非交互方式工作,因而能够在用户注销后在后台进行工作(针对Linux command)。在缓慢甚至不稳定的连接中依…

基于SSM的药店药品商城管理系统

介绍 本项目分为前后台&#xff0c;分为管理员与普通用户两种角色&#xff0c;管理员登录后台&#xff0c;普通用户登录前台&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,订单管理,客户管理,药品管理,类目管理等功能。用户角色包含以下功能&#xff1a; 用户首…

pycharm打包python文件为exe文件(图文教程)

1.安装pyinstaller库 pip3 install pyinstaller 2.使用pyinstaller 打包文件 首先确保Terminal命令行中&#xff0c;你的路径和你的项目是同一个路径 我的项目就是放在golden_dev中的。 3.命令行内输入打包代码 pyinstaller -F -w gold_miner.py gold_miner.py 是我的项目…

【linux】Ubuntu 查询CPU、GPU、硬盘、内存等硬件信息

环境 硬件&#xff1a;通用PC /Jetson Xavier NX 套件 系统&#xff1a;Ubuntu 20.04 软件 &#xff1a; 获取CPU信息 在Ubuntu系统中&#xff0c;可以通过在终端执行以下命令来获取CPU的名称&#xff1a; lscpu如果需要精准查找CPU名称 、核心数、厂商可以使用 查看CPU名…

前视声呐目标识别定位(二)-目标识别定位模块

前视声呐目标识别定位&#xff08;一&#xff09;-基础知识 前视声呐目标识别定位&#xff08;二&#xff09;-目标识别定位模块 前视声呐目标识别定位&#xff08;三&#xff09;-部署至机器人 前视声呐目标识别定位&#xff08;四&#xff09;-代码解析之启动识别模块 …

[xboard]real6410-6.1 移植rootfs之busybox

文章目录 busybox下载 https://busybox.net/downloads/ [图片] wget https://busybox.net/downloads/busybox-x.yy.z.tar.bz2 tar xvf busybox-x.yy.z.tar.bz2 busybox配置编译 busybox-1.35.0$ export CROSS_COMPILE=/home/gjw/2024/compile/arm-2014.05/bin/arm-none-linux-g…

【ZZULIOJ】1033: 五级制成绩(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 给定一个百分制成绩, 请根据百分制成绩输出其对应的等级。转换关系如下&#xff1a; 90分及以上为’A’&#xff0c;80~89为’B’&#xff0c; 70~79为’C’&#xff0c; 60~69为’D’&#xff0c;6…