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.hqwc.cn/news/589753.html

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

相关文章

E-魔法猫咪(遇到过的题,做个笔记)

题解&#xff1a; 来自学长们思路&#xff1a; 其中一种正解是写单调队列。限制队列内的数单调递增&#xff0c;方法为每当新来的数据比当前队尾数据小时队 尾出列&#xff0c;直到能够插入当前值&#xff0c;这保证了队头永远是最小值。因此总体思路是队尾不断插入新值的同时 …

ABAP Restful接口

文章目录 ABAP Restful接口代码 ABAP Restful接口 代码 METHOD if_http_extension~handle_request.TYPES: BEGIN OF parameter,name TYPE string,value TYPE string,END OF parameter.TYPES : BEGIN OF ty_material,werks TYPE marc-werks, "工厂matnr TYPE mara-matnr, …

GDPU Java 天码行空6

一、实验目的 1、理解设计模式的基本思想&#xff1b; 2、理解并掌握常用的几种设计模式&#xff1b; 3、根据需求编写简单工厂设计模式&#xff1b; 4、根据需求编写适配器设计模式&#xff1b; 二、实验内容和步骤 1. 简单工厂模式实现计算器 请用简单工厂模式设计并编码…

自动驾驶传感器:传感的本质

自动驾驶传感器&#xff1a;传感的本质 附赠自动驾驶学习资料和量产经验&#xff1a;链接 0. 前言 这个系列的背景是&#xff1a;工作时候需要攒一台数据采集车辆&#xff0c;那段时间需要熟悉感知硬件&#xff0c;写了不少笔记&#xff0c;都是些冗长的文章&#xff0c;感兴…

Vue3从入门到实战:路由的query和params参数

在Vue 3中&#xff0c;我们可以通过路由的查询参数来传递数据。这意味着我们可以在不同的页面之间传递一些信息&#xff0c;以便页面可以根据这些信息来显示不同的内容或执行不同的操作。 查询参数的使用方式类似于在URL中添加附加信息&#xff0c;以便页面之间可以根据这些信息…

vue3源码解析——watch和watchEffect区别

watch和watchEffect是Vue 3.0中新增的两个响应式API&#xff0c;用于监听数据的变化。watch适用于需要获取新值和旧值&#xff0c;或者需要懒执行的场景&#xff0c;而watchEffect适用于需要监听多个数据源&#xff0c;并且需要立即执行的场景。它们之间的区别如下&#xff1a;…

【Linux】详解动静态库的制作和使用动静态库在系统中的配置步骤

一、库的作用 1、提高开发效率&#xff0c;让开发者所有的函数实现不用从零开始。 2、隐藏源代码。 库其实就是所有的.o文件用特定的方式进行打包形成一个文件&#xff0c;各个.o文件包含了源代码中的机器语言指令。 二、动态库和静态库的制作和使用 2.1、静态库的制作和使用…

美创科技获浙江省网络空间安全协会多项荣誉认可

4月2日&#xff0c;浙江省网络空间安全协会第二届会员大会第一次会议在杭州隆重召开&#xff0c;近180家会员单位代表、数十位特邀专家、嘉宾莅临现场。浙江省委网信办副主任马晓军出席会议并致辞&#xff0c;本次大会由协会秘书长吴铤主持。 凝心聚力&#xff0c;继往开来&…

ViveNAS性能调试笔记(一)

ViveNAS是一个开源的NAS文件服务软件&#xff0c;有一套独立自创的架构&#xff0c;ViveNAS希望能做到下面的目标&#xff1a; - 能支持混合使用高性能的介质(NVMe SSD)和低性能介质&#xff08;HDD&#xff0c;甚至磁带&#xff09;。做到性能、成本动态均衡。因此ViveNAS使用…

C++--类的定义

一.类的定义 class 类名 { private:成员属性或成员函数 protected:成员属性或成员函数 public:成员属性或成员函数 };补充&#xff1a; &#xff08;1&#xff09;class是声明类的关键字&#xff0c;class后跟类名。类名一般首字母大写。 &#xff08;2&#xff09;类包括成员…

怎样在Linux搭建NTP服务器

搭建 NTP&#xff08;Network Time Protocol&#xff09;服务器可以帮助你在局域网内提供时间同步服务&#xff0c;让网络中的设备都使用统一的时间。以下是在 Linux 系统上搭建 NTP 服务器的基本步骤&#xff1a; 安装 NTP 服务器软件&#xff1a; 在终端中执行以下命令安装 N…

【爬虫框架Scrapy】02 Scrapy入门案例

接下来介绍一个简单的项目&#xff0c;完成一遍 Scrapy 抓取流程。通过这个过程&#xff0c;我们可以对 Scrapy 的基本用法和原理有大体了解。 1. 本节目标 本节要完成的任务如下。 创建一个 Scrapy 项目。 创建一个 Spider 来抓取站点和处理数据。 通过命令行将抓取的内容…