动态规划:样例讲解一篇通

2023-11-16

概念讲解

动态规划是把大问题分解成子问题(但不能简单的分解,子问题要具有相同子结构的解),并综合子问题的解,导出大问题的解,问题求解耗时会按问题规模呈幂级数增加。

基本方法:为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中。

举例

【问题】 求两字符序列的最长公共字符子序列
假设,两个 序列 a[],b[],有公共最长子序列 z[]
则必须具有如下性质:
    (1)a和b两序列尾末元素相等(a[m] == b [n])时,则同时去除尾部元素后,新的公共子序列为z去除尾部元素(“z[0]...z[k-1]”为a[m-1]和b [n-1]两序列的公共子序列)。
    (2)而a和b两序列尾部元素不相等(a[m] != b [n])时,
    若z[k]!=a[m],则“z[0]...z[k-1]”为a[m-2]和b[n-1]两序列的公共子序列
    若z[k]!=b[m],则“z[0]...z[k-1]”为a[m-1]和b[n-2]两序列的公共子序列

由以上性质可以划分子问题,
    找ab的公共子序列,
        若a[m] == b [n]则进一步解决子问题 a[m-1]和b[n-1]的公共子序列。
        若不相等则子问题为找出(a[m-2]和b[n-1])的公共子序列L1,再找出(a[m-1]h和b[n-2])的公共子序列L2,取L1和L2中较长的作为最长公共子序列,也就是哪个长用哪个。
程序设计
    引进两个辅助数组(用于构造最优解)
    用c[i][j]记录a[i]与b[j]的LCS 的长度
    用d[i][j]记录c[i][j]是通过哪个子问题取得的(-1,0,1标识左、左上、上三个方向)
伪代码
    a和b的序列长度分别是m,n
    如a[m] == b[n],则公共子序列长度c[m,n] = c[m - 1, n -1] + 1;(i--,j--)
    如a[m] != b[n],则c[m,n] = max{c[m,n - 1], c[m - 1, n]}; ( c[i,j-1]>=c[i-1,j]时则j--,否则i--;)
    其中,i和j作为index,分别从m,n开始,递减循环直到i = 0,j = 0

声明: 以下内容,引自网络

执行代码
#include <stdio.h>
#include <string.h>
#define MAXLEN 100

void LCSLength(char *x, char *y, int m, int n, int c[][MAXLEN], int b[][MAXLEN])
{
    int i, j;

    for(i = 0; i <= m; i++)
        c[i][0] = 0;
    for(j = 1; j <= n; j++)
        c[0][j] = 0;
    for(i = 1; i<= m; i++)
    {
        for(j = 1; j <= n; j++)
        {
            if(x[i-1] == y[j-1])
            {
                c[i][j] = c[i-1][j-1] + 1;
                b[i][j] = 0;
            }
            else if(c[i-1][j] >= c[i][j-1])
            {
                c[i][j] = c[i-1][j];
                b[i][j] = 1;
            }
            else
            {
                c[i][j] = c[i][j-1];
                b[i][j] = -1;
            }
        }
    }
}

void PrintLCS(int b[][MAXLEN], char *x, int i, int j)
{
    if(i == 0 || j == 0)
        return;
    if(b[i][j] == 0)
    {
        PrintLCS(b, x, i-1, j-1);
        printf("%c ", x[i-1]);
    }
    else if(b[i][j] == 1)
        PrintLCS(b, x, i-1, j);
    else
        PrintLCS(b, x, i, j-1);
}

int main(int argc, char **argv)
{
    char x[MAXLEN] = {"ABCBDAB"};
    char y[MAXLEN] = {"BDCABA"};
    int b[MAXLEN][MAXLEN];
    int c[MAXLEN][MAXLEN];
    int m, n;

    m = strlen(x);
    n = strlen(y);

    LCSLength(x, y, m, n, c, b);
    PrintLCS(b, x, m, n);

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划:样例讲解一篇通 的相关文章

  • 测量数组的“无序”程度

    给定一个值数组 我想找到总 分数 其中每个元素的分数是数组中出现在其之前的具有较小值的元素的数量 e g values 4 1 3 2 5 scores 0 0 1 1 4 total score 6 O n 2 算法很简单 但我怀疑可以通
  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 计算给出数组中最小标准差的子集

    让我们有一个大小的向量N 例如 x rand N 1 我想计算长度子集的最小标准差K在向量中 When N and K很小 很容易找到最好的子集 因为我可以使用nchoosek N K 枚举所有可能的子集 但是当值N and K比我们说的要
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 为什么Python中pop()的大O与pop(0)不同[重复]

    这个问题在这里已经有答案了 他们不应该都是O 1 因为从 Python 列表中的任何位置弹出一个元素涉及销毁该列表并在新的内存位置创建一个元素 蟒蛇的list实现使用动态调整大小的 Carray在引擎盖下 删除元素usually要求您移动后
  • 将数字 n 拆分为 k 个不同数字的总和

    我有一个数字 n 我必须将它分成 k 个数字 使得所有 k 个数字都是不同的 k 个数字的总和等于 n 并且 k 最大 例如 如果 n 为 9 则答案应为 1 2 6 如果 n 为 15 则答案应为 1 2 3 4 5 这就是我尝试过的 v
  • 对列表中的相邻元素进行分组

    假设我想编写一个函数来执行此操作 输入 1 1 3 3 4 2 2 5 6 6 输出 1 1 3 3 4 2 2 5 6 6 它将相同的相邻元素分组 这个方法的名称应该是什么 此操作有标准名称吗 In 1 1 3 3 4 2 2 5 6 6
  • 使用 stl sort 对表进行排序

    我有一个巨大的表 约 50Gb 格式为 i j k 来自稀疏矩阵 存储为 uint32 t idx1 idx2 float vals uint32 t tablesize 我想使用给定的比较函数 即 idx1 和 idx2 的函数 对其进行
  • 如何确定字符串的最小公约数?

    我在面试时被问到以下问题 并被它难住了 我遇到的部分问题是要下定决心要解决什么问题 起初我并不认为这个问题在内部是一致的 但后来我意识到它要求你解决两个不同的问题 第一个任务是弄清楚一个字符串是否包含另一个字符串的倍数 但第二个任务是在两个
  • 为什么使用 no-op 来填补 paxos 事件之间的空白是合法的?

    我正在学习Paxos算法 http research microsoft com en us um people lamport pubs paxos simple pdf http research microsoft com en us
  • n的渐近增长选择下限(n/2)

    如何找到 n select Floor n 2 的渐近增长 我试过 使用扩展并得到它等于 n n 1 floor n 2 1 n floor n 2 知道我该如何从那里去吗 感谢任何帮助 更喜欢提示而不是答案 我同意上面的答案 但想提供更多
  • 仅使用两个变量交换两个数字

    它如何执行交换 a a b b a b a b a 我不同意把它换成书 书中的选项包括 a和b的值的补集 否定和b 希望这些选项也不能满足它 正确的算法应该是 a a b b a b a a b
  • Python 将字符串组合成尽可能短的字符串?

    如果我有一个字符串列表 我想将它们组合成一个具有重叠字符的字符串 如果没有剩余的重叠字符串 请将其添加到末尾 这是一个过于简化的版本 input one two output twone 我正在寻找一种方法来对输入列表中的任意数量的字符串执
  • 为什么 n 按位和 -n 总是返回最右边的位(最后一位)

    这是Python代码片段 1 1 1 2 2 2 3 3 1 看来任何n n总是返回最右边 最后 位 我真的不知道为什么 有人可以帮助我理解这一点吗 这是由于负数以二进制表示的方式 称为二进制补码表示 创建某个数字 n 的补码 换句话说 创
  • 我该如何解决? KnapSack - 值完全相同,但每个对象都有三个权重

    我在解决我的练习时遇到问题 我读到了动态规划和算法 我认为我的练习是 特定背包问题 我用暴力法解决了它 但我无法用动态规划解决它 我有一艘重300吨的船 背包 有些晶体本身含有 3 种物质 X Y Z 每种物质都有重量 并且所有晶体都具有相
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • 哪种算法可以有效地找到路径一定距离内的一组点?

    给定一组点s 一组 x y 坐标 和由连接一组点的线段组成的路径l 描述一种有效的算法 可用于从s在指定距离内d路径的l 其实际应用可能是查找沿城市之间的公路旅行路径 10 英里内任意位置的餐馆列表 For example in the f
  • 在c#中遍历对象树

    我有一棵由多个对象组成的树 其中每个对象都有一个名称 string id int 以及可能是同一类型的子数组 如何遍历整个树并打印出所有 id 和名称 我是编程新手 坦率地说 我很难理解这个问题 因为我不知道有多少个级别 现在我正在使用fo
  • 数字总和直到作为输入给出的数字

    如果给出一个数字作为输入 则找到该数字之前所有数字的总和 例如输入 11 则答案为 1 2 9 1 0 1 1 蛮力方法是计算所有小于某个数字的数字的数字之和 我已经实现了该方法 我想知道是否有其他方法可以在不实际计算每个数字的数字之和的情

随机推荐

  • 空值的处理

    1 取空值的时机 1 1不知道取什么值 比如学生登记表 某个学生的年龄忘记填了 1 2不能取值 比如选了课 缺考了 所以成绩表的成绩填空 1 3由于某种原因不便填写 比如一个人的手机号码不便填写 2 空值的产生 2 1没有给属性列赋值 2
  • 数据结构学习(一)数据结构基础

    文章目录 算法与数据结构学习 一 数据结构基础 1 数据结构 1 1 什么是数据结构 1 2 学习数据结构的必要性 2 算法 2 1 怎么衡量算法的好坏 2 1 1 时间复杂度 2 1 2 空间复杂度 2 2 时间复杂度的计算 2 3 常见
  • 【unity】【jit】【游戏开发】讲解ios系统不支持JIT的来龙去脉,以及unity在IOS上需要使用反射时候的替代方案

    标题有点长啊 很彪 所以我们叫彪题 咋地 东北地 你瞅啥 1 带有增高垫IL的c c 语言作为一种高级语言 是不能直接在我们的CPU上来直接运行的 需要编译成IL语言 Intermediate Language 即中间层语言 就是这么高冷
  • 《机器学习实战》第六章 Python3代码-(亲自修改测试可成功运行)

    由于Peter Harrington所著的这本 机器学习实战 中的官方代码是Python2版本的且有一些勘误 使用Python3的朋友运行起来会有很多问题 所以我将自己在学习过程中修改好的Python3版本代码分享给大家 以供大家交流学习
  • STM32 bool

    STM32中基于库V3 5的头文件中 去掉了对bool类型变量的定义 而将它放在了文件stdbool h中 d Keil v5 ARM ARMCC include stdbool h stdbool文件内容如下 stdbool h ISO
  • C++将字符串中包含指定字符串范围内的字符串全部替换

    概述 将指定字符串所在的范围之内的字符串全部替换为指定的字符串 如 源字符串 START dfh待到花开月圆时 两首相顾心相连 END dhussd2434xhuhu是别人十大海归 转换后的字符串 dfh待到花开月圆时 两首相顾心相连 dh
  • XXE漏洞

    何为XXE 简单来说 XXE就是XML外部实体注入 当允许引用外部实体时 通过构造恶意内容 就可能导致任意文件读取 系统命令执行 内网端口探测 攻击内网网站等危害 典型攻击手法 XML又是什么呢 XML用于标记电子文件使其具有结构性的标记语
  • 自动填充固定行数的 GridView

    效果图 代码 C lt script runat server gt 计算数据 这里可以适当修改从数据库中获取
  • Android学习一课一得

    Android学习一课一得 文章目录 引言 1 学习入门 1 1Android开发入门 1 2用户界面设计与布局 1 3数据存储与持久化 1 4网络通信与数据获取 1 5结语 2 学习成果 2 1学习经验与方法 2 2在Android应用中
  • Gym 102152(CDZSC——2020寒假大一愉悦个人赛)

    Gym 102152 A B C D E F G H I J K L http codeforces com gym 102152 A B Memory Management System It is your first day in y
  • c++实现文件版本类b+树

    一 插入 无根节点 当没有根结点时 操作相当简单 只是从存储空间中申请一个新结点 然后设置该结点的prev next is inner 然后将要插入的数据插入该结点 void insert const t var key t val v 没
  • "1,2;3,4,5;6,7,8,9" 转换成[1,2][3,4,5][6,7,8,9]

    1 2 3 4 5 6 7 8 9 转换成 1 2 3 4 5 6 7 8 9 public class Test public static void main String args String s 1 2 3 4 5 6 7 8 9
  • hduoj 2002

    计算球体积 Problem Description 根据输入的半径值 计算球的体积 Input 输入数据有多组 每组占一行 每行包括一个实数 表示球的半径 Output 输出对应的球的体积 对于每组输入数据 输出一行 计算结果保留三位小数
  • Unity报错之【NullReferenceException: Object reference not set to an instance of an object】

    空指针错误 Object并没有作为一个对象的实例 一般都是引用类型的变量没有实例化便使用变量进行一些实例对象才能进行的操作 例如list没有new实例 便对其进行添加元素 private List
  • Python中对文件的常规操作

    文章目录 一 读取文本文件数据 1 1 读文件 r 标识符 1 2 写文件 w操作 1 3 写文件 write only a操作 1 4 r 操作 1 5 w 操作 1 6 a 操作 二 读取非纯文本数据 三 指针的变化 四 上下文管理器
  • web漏洞类型概述(owasp top10笔记)

    一 owasp top10是什么 OWASP 开放式Web应用程序安全项目 OWASP Open Web Application Security Project 是一个非营利组织 不附属于任何企业或财团 它提供有关计算机和互联网应用程序的
  • 基于opencv -python--银行卡识别

    import cv2 def sort contours cnts method left to right reverse False i 0 if method right to left or method bottom to top
  • R 修改安装包默认存放位置的方法

    目录 R语言修改安装包的默认储存位置 查看默认的安装包位置 第一种方法会修改当前用户的R包位置 第二种方法 永久改变 永久有效 第三种方法 修改环境变量 总结 R语言修改安装包的默认储存位置 查看默认的安装包位置 一般会有两个目录 如下 第
  • 计算机操作系统-进程篇

    一 进程 进程 progress 是指计算机中已运行的程序 每个进程都有自己的地址空间 内存 寄存器和堆栈等资源 它们与其他进程相互隔离 互不干扰 进程是操作系统中最基本的资源分配单位 也是操作系统中最重要的概念之一 在操作系统中 进程是由
  • 动态规划:样例讲解一篇通

    概念讲解 动态规划是把大问题分解成子问题 但不能简单的分解 子问题要具有相同子结构的解 并综合子问题的解 导出大问题的解 问题求解耗时会按问题规模呈幂级数增加 基本方法 为了节约重复求相同子问题的时间 引入一个数组 不管它们是否对最终解有用