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

news2024/11/24 3:28:49

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

在这里插入图片描述

分析

设最长公共子序列 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.coloradmin.cn/o/1566183.html

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

相关文章

基于深度学习的吸烟行为检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于深度学习的吸烟行为检测系统&#xff0c;核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及基于Streamlit的交互式…

某音a_bogus 流程vmp分析

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 仅研究。网站链接自己去找。 前言 这里a_bogus 又是个vmp。 还是个多层嵌套…

小红数组操作(结构体模拟链表详细解析)(双向链表)c/c++

题目描述: 小红拿到了一个数组&#xff0c;初始数组为空&#xff0c;她希望你实现以下两种操作&#xff1a; 1. 输入x,y&#xff0c;将x插入在元素y的右边。保证此时数组中没有元素等于x&#xff0c;且数组中存在一个y。特殊的&#xff0c;如果将x插入在数组的最左边&#xff0…

微生物群落关键种识别:一种不依赖于网络的自上而下的方法

微生物群落在促进养分循环、协助植物生长、维持人体健康等方面发挥着重要的作用。群落关键种对维持微生物群落稳定性具有重要影响&#xff0c;识别关键种一直是微生物生态学中的热点话题。识别关键种主要有两种框架&#xff1a;数据驱动的方法&#xff08;data driven method&a…

用ENIGMA-toolbox作图

之前一直使用ggseg呈现结果&#xff0c;最近想试一试其他绘图工具。ENIGMA-toolbox有所了解&#xff0c;绘图功能看起来门槛不高&#xff0c;所以就试着用它呈现一些结果。Matlab版本的ENIGMA-toolbox直接使用就是SurfStat的功能绘图&#xff0c;Python版本的绘图功能应该是根据…

详解k8s集群内外的访问方式

文章目录 1、集群内访问2、集群外访问2.1、Ingress转发外网请求2.2、LoadBanlancer接入外网请求2.3、NodePort接入外网请求 3、总结和对比3.1、Ingress、NodePort和LoadBalancer总结3.2、Ingress和网关的区别 1、集群内访问 在k8s中创建的微服务&#xff0c;大部分都是在集群内…

手搓 Docker Image Creator(DIC)工具(02):预备知识

此节主要简单介绍一下 Docker、Dockerfile 的基本概念&#xff0c;Dockerfile 对的基本语法&#xff0c;Windows 和 macOS 下 Docker 桌面的安装&#xff0c;Docker 镜像的创建和运行测试等。 1 关于 Docker Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者打包应用…

非关系型数据库-----------Redis的主从复制、哨兵模式

目录 一、redis群集有三种模式 1.1主从复制、哨兵、集群的区别 1.1.1主从复制 1.1.2哨兵 1.1.3集群 二、主从复制 2.1主从复制概述 2.2主从复制的作用 ①数据冗余 ②故障恢复 ③负载均衡 ④高可用基石 2.3主从复制流程 2.4搭建redis主从复制 2.4.1环境准备 2.4…

hadoop在linux上启动成功了,但是浏览器访问不了

根据网上的资料进行安装hadoop的伪集群 都安装成功&#xff0c;并且启动也成功了&#xff0c;如下图所示&#xff1a; 2、但是在浏览器上确是怎么也访问不了&#xff0c; 解决思路&#xff0c; 2.1、根据网上的一些文章处理解决是关闭防火墙&#xff0c; 2.1.1、我根据操作步骤…

unity工程输出的log在哪里?

在编辑器里进行活动输出的log位置&#xff1a; C:\Users\username\AppData\Local\Unity\Editor\Editor.log ------------------------------------ 已经打包完成&#xff0c;形成的exe运行后的log位置&#xff1a; C:\Users\xxx用户\AppData\LocalLow\xx公司\xx项目

manga-ocr漫画日文ocr

github 下载 解压 anaconda新建环境 conda create -n manga_ocr python3.8 激活环境 conda activate manga_ocr cd到解压目录 cd /d manga-ocr-master 安装依赖包 pip install -r requirements.txt pip3 install manga-ocr 下载离线model huggingface 123云盘 解压到一个目录…

Python爬虫详解:原理、常用库与实战案例

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言引言&#xff1a;一、爬虫原理1. HTTP请求与响应过程2. 常用爬虫技术 二、P…

回溯算法 DFS

目录 回溯算法和dfs的区别回溯算法基本框架例题&#xff1a;【1,2&#xff0c;3】的全排列代码详解完整代码 DFS 本文思路、代码均参考于&#xff1a;https://labuladong.online/algo/essential-technique/backtrack-framework-2/#%E4%B8%80%E3%80%81%E5%85%A8%E6%8E%92%E5%88%…

搭建 Qt 开发环境

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、QT SDK 的下载和安装 1.QT SDK 的下载 二、QT SDK的安装 1、找到下载的文件并双击 2、双击之…

【项目实战经验】DataKit迁移MySQL到openGauss(上)

前言 本文将分享DataKit迁移MySQL到openGauss的项目实战&#xff0c;供广大openGauss爱好者参考。 1. 下载操作系统 https://www.openeuler.org/zh/download https://support.huawei.com/enterprise/zh/doc/EDOC1100332931/1a643956 https://support.huawei.com/enterprise…

VMware虚拟机三种网络模式配置

vmware有三种网络工作模式&#xff1a;Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网络地址转换模式&#xff09;、Host-Only&#xff08;仅主机模式&#xff09;。 1. 打开网络编辑器&#xff08;编辑 --> 虚拟网络编辑器&#xff09; 在主机上有VMware Ne…

LeetCode-19. 删除链表的倒数第 N 个结点【链表 双指针】

LeetCode-19. 删除链表的倒数第 N 个结点【链表 双指针】 题目描述&#xff1a;解题思路一&#xff1a;双指针解题思路二&#xff1a;优化解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。…

hexo博客7:构建简单的多层安全防御体系

【hexo博客7】构建简单的多层安全防御体系 写在最前面理解全面安全策略的重要性防御常见的网络攻击1. SQL注入攻击2. 文件上传漏洞3. 跨站脚本攻击&#xff08;XSS&#xff09;4. 跨站请求伪造&#xff08;CSRF&#xff09;5. 目录遍历/本地文件包含&#xff08;LFI/RFI&#x…

CRMEB 标准版 v5.3公测版发布,快来体验

演示站 后台&#xff1a;http://v5.crmeb.net/admin 账号&#xff1a;demo 密码&#xff1a;crmeb.com H5端&#xff1a;http://v5.crmeb.net 新增功能 后台支持所有功能设置搜索 事业部&#xff1a;想在事业部添加代理商&#xff0c;可以在后台选择添加员工&#xff0c;设…

【c++】STl-list使用list模拟实现

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 …