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

这篇具有很好参考价值的文章主要介绍了9.动态规划——4.最长公共子序列(动态规划类的算法题该如何解决?)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

分析

设最长公共子序列 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的背包中所能获得的最大价值。

通过遵循这些步骤,可以有效地解决大多数动态规划类的问题。当然,对于更复杂的问题,可能还需要一些额外的技巧和优化。文章来源地址https://www.toymoban.com/news/detail-847606.html

到了这里,关于9.动态规划——4.最长公共子序列(动态规划类的算法题该如何解决?)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【算法】力扣【动态规划,LCS】1143. 最长公共子序列

    1143. 最长公共子序列 本文是对 LCS 这一 动态规划 模型的整理,以力扣平台上的算法题1143:最长公共子序列为模板题进行解析。 该题目要求计算两个字符串的最长公共子序列(Longest Common Subsequence,简称LCS)的长度。字符串的子序列是指在不改变字符顺序的情况下,通过删去

    2024年01月17日
    浏览(16)
  • 【算法(四·三):动态规划思想——最长公共子序列问题】

    【算法(四·三):动态规划思想——最长公共子序列问题】

    最长公共子序列(Longest Common Subsequence,简称LCS)问题是一种常见的字符串处理问题。它的**目标是找到两个或多个字符串中的最长公共子序列,这个子序列不需要是连续的,但字符在原始字符串中的相对顺序必须保持一致。**例如,考虑两个字符串\\\"ABCD\\\"和\\\"ACDF\\\",它们的最长公

    2024年04月13日
    浏览(12)
  • 算法套路十五——动态规划求解最长公共子序列LCS

    算法套路十五——动态规划求解最长公共子序列LCS

    给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

    2024年02月04日
    浏览(11)
  • python数据结构与算法-动态规划(最长公共子序列)

    python数据结构与算法-动态规划(最长公共子序列)

    一个序列的子序列是在该序列中删去若干元素后得 到的序列。 例如:\\\"ABCD”和“BDF”都是“ABCDEFG”的子序列。 最长公共子序列(LCS) 问题: 给定两个序列X和Y,求X和Y长度最大的公共子字列。 例:X=\\\"ABBCBDE”Y=\\\"DBBCDB”LCS(XY)=\\\"BBCD\\\" 应用场景:字符串相似度比对 (1)问题思考 思考: 暴

    2024年02月08日
    浏览(13)
  • 算法分析:C语言实现动态规划之最长公共子序列

    算法分析:C语言实现动态规划之最长公共子序列

    最长公共子序列问题:          下面的简单问题说明了动态规划的基本原理。在字母表一∑上,分别给出两个长度为n和m的字符串A和B,确定在A和B中最长公共子序列的长度。这里,A = a₁a₂...an。的子序列是一个形式为a₁ka₂k...aik的字符串,其中每个i都在1和n之间,并且

    2023年04月21日
    浏览(12)
  • 算法分析 | 动态规划算法设计之最长公共子序列 C语言版

    算法分析 | 动态规划算法设计之最长公共子序列 C语言版

    声明:凡代码问题,欢迎在评论区沟通。承蒙指正,一起成长! 目录 一、实验内容与要求  二、概要设计 三、直接上代码      四、输入数据及运行结果   内容:最长公共子序列 ·若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序

    2024年02月02日
    浏览(16)
  • 算法 DAY52 动态规划10 1143.最长公共子序列 1035.不相交的线 53. 最大子数组和

    本题和动态规划:718. 最长重复子数组 (opens new window)区别在于这里不要求是连续的了 1、dp数组 dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j] 2、递推公式 因为不强调是连续的,当前dp[i][j] 就有三种路径可以选:dp[i-1][j] dp[i][j-1]

    2024年02月03日
    浏览(11)
  • 动态规划--最长公共子序列

    动态规划--最长公共子序列

    动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题﹐ 即将大规模变成小规模 ,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是﹐适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。 他们之间有关系

    2024年02月04日
    浏览(22)
  • 动态规划——最长公共子序列

    动态规划——最长公共子序列

    先来讲解以下什么是最长公共子序列。最长公共子序列不是最长相同字符串,有点相似但不一样,来举个简单的例子,有字符串s1=bcdea,s2=abce,最长相同字符串是bc,最大公共部分是2;而最长公共子序列则是bce,最大公共部分是3。可以看出,公共子序列不需要连续相等,有相

    2023年04月19日
    浏览(10)
  • 动态规划之最长公共子序列模板

    夏令营:动态规划特训 - 【算法模板题】最长公共子序列 - 蓝桥云课 (lanqiao.cn) 我们来解释一下状态转移方程吧。 dp[i][j]的含义是第i个和第j个字符,i与j的下标从1开始,代表着原子符串的第一个字符。那么理所当然字符串a的第0个字符和字符串b的0个字符的公共长度为0.如果字

    2024年02月12日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包