浅谈字符串动态规划

本文介绍了动态规划的概念,并重点讨论了字符串动态规划,包括最长公共子序列问题和DNA分子的最佳比对问题的解题思路,通过找规律和画图的方式推导状态转移方程。文章提供详细例题解析,探讨了如何利用动态规划解决这类问题。
摘要由CSDN通过智能技术生成

定义

动态规划

在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线.这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策问题。在多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化的过程为动态规划方法 。动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式. ----选自百度百科

字符串动态规划

字符串动态规划是动态规划问题的一类,主要研究字符串 d p dp dp,该 d p dp dp解法与普通 d p dp dp基本一致。

个人理解思路

①找规律

通过找规律的方式推出状态转移方程。

②画图

通过画图的方式推出状态转移方程。

例题解析

题目名称

最长公共子序列
【HNOI】DNA分子的最佳比对

最长公共子序列题解

题目描述

原题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列 x = “ x 0 , x 1 , … , x n − 1 ” x=“x0,x1,…,xn-1” x=x0x1xn1, 序列 Y = “ y 0 , y 1 , . . . , y k − 1 Y=“y_0,y_1,...,y_{k-1} Y=y0,y1,...,yk1 X X X的子序列,存在 X X X的一个严格递增下标序 列 < i 0 , i 1 , . . . , i k − 1 > <i_0,i_1,...,i_{k-1}> <i0,i1,...,ik1>,使得对所有的 j = 0 , 1 , . . . , k − 1 j=0,1,...,k-1 j=0,1,...,k1,有 x i , j = " y j x_{i,j}="yj xi,j="yj。 例如, x = “ A B C B D A B ” , Y = “ B C D B ” x=“ABCBDAB”,Y=“BCDB” x=ABCBDABY=BCDB X X X的一个子序列。 对给定的两个字符序列,求出他们最长的公共子序列长度。

简化描述:给定两个字符串,求解这两个字符串的最长公共子序列 ( L C S ) (LCS) (LCS)比如: B D C A B A BDCABA BDCABA A B C B D A B ABCBDAB ABCBDAB的最长公共子序列为 4 4 4

题解
思路说明

设当前的最长公共子序列长度为 f [ i ] [ j ] f[i][j] f[i][j],则 f [ i ] [ j ] f[i][j] f[i][j]一定是由 f [ i − 1 ] [ j ] f[i-1][j] f[i1][j] f [ i ] [ j − 1 ] f[i][j-1] f[i][j1]转移过来的。如果把 a a

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,可以使用scanf函数来读取字符串。在引用\[1\]中的示例代码中,使用了scanf_s函数来读取字符串。scanf_s函数的用法是scanf_s("%s", str, (unsigned int)sizeof(str)),其中str是用来存储字符串的字符数组,sizeof(str)表示str数组的大小。这样可以确保读取的字符串不会超出数组的范围。另外,在C++11中,不推荐使用scanf和gets函数,因为它们被认为是不安全的。推荐使用scanf_s和gets_s函数来读取字符串。\[2\] 另一种读取字符串的方法是使用string类。在引用\[3\]的示例代码中,使用了string类来接收字符串输入。可以使用cin对象的>>运算符来读取字符串,例如cin >> s,其中s是一个string对象。这种方法可以方便地读取包含空格的字符串。 #### 引用[.reference_title] - *1* *2* [C/C++字符串输入scanf、gets、cin、getline、getchar](https://blog.csdn.net/qq_14824921/article/details/124356747)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C/C++ 中输入字符串的几种方式](https://blog.csdn.net/m0_64604482/article/details/129249732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值