【算法设计与分析】实验3:动态规划—最长公共子序列

目录

一、实验目的

二、实验环境

三、实验内容

四、核心代码

五、记录与处理

六、思考与总结

七、完整报告和成果文件提取链接


一、实验目的

        掌握动态规划求解问题的思想;针对不同的问题,会利用动态规划进行设计求解以及时间复杂度分析,并利用JAVA/C/C++等编程语言开展编码实践(语言自选)。

        理解两组序列的最长公共子序列问题,能够利用动态规划,开展问题的最优子结构性质分析、子结构递归关系构建、自底向上最优值求解以及最优解构造。

二、实验环境

        1、机房电脑  Window11

        2、Eclipse/Dev-C++等

三、实验内容

        实验要求:

        ①掌握动态规划求解问题的策略及思路;

        ①基于动态规划开展最长公共子序列问题的算法设计与优化;

        ③对上述算法进行时间复杂性分析,并输出程序运行时间及运行结果。

实验原理:

1、按照自己的理解,总结描述动态规划求解问题的思路策略;

    动态规划是针对于递归分治所存在的缺点而设计出来的算法思想,递归分治算法存在大量子问题被重复计算,效率低下的问题,如下图,多个子节点在不同的递归表达式中被重复计算,增加了算法冗余度。

      而在动态规划的算法中,虽然与分治法类似,但是动态规划却在思考如果能够保存已解决的子问题的答案,而在需要时再直接找出已求得的节点,就可以避免大量重复计算,从而得到多项式时间算法,这样就可以避免同一个问题被多次计算的问题,如下图。

动态规划是解决具有重叠子问题和最优子结构性质的问题的有效方法。 它的基本原理是将大问题分解为小问题,通过保存中间结果来避免重复计算,从而提高算法的效率。动态规划方法所耗时往往远少于一般解法。

2、针对最长公共子序列问题,如何利用动态规划进行建模设计与优化;

①给出求解过程及建模思路,以及子序列的构造原理;

      用动态规划算法可以解决最长公共子序列这一经典问题,公共子序列问题,寻找两个字符串中都存在的最长子序列,这个最长子序列可以不是连续的,但是要保证其相对顺序一样

先找出最优问题特点:设有两个序列X={ x1 , x2 ,…, xm }和Y={ y1 , y2 ,…, yn }的最长公共子序列为Z={ z1 , z2 ,…, zk }

(1)若xm =yn ,则zk =xm =yn ,且zk-1xm-1yn-1 的最长公共子序列。

(2)若xmyn  且Zkxm ,则zkxm-1 和Y的最长公共子序列。

(3)若xmyn  且Zkyn ,则zk 是X和yn-1 的最长公共子序列。

所以2个序列的最长公共子序列包含了这2个序列的前缀的最长公共子序列,最长公共子序列问题具有最优子结构性质

定义递归关系;根据以上已经求得的最长公共子序列问题的性质,我们可以知道如下图:

根据此递归关系我们可以求得以下递归方程,其中c [i][j]数组记录序列的最长公共子序列长度。首先当i=0或j=0时,有一个序列为空,所以c [i][j]=0

该算法的时间复杂度为O(m n)

②针对序列X={a,b,a,d,e},Y={a,r,f,a,e},给出子结构二维数组。

根据上列的c[i][j]表达式可以求出:

X

Y

a

b

a

d

e

0

0

0

0

0

0

a

0

1

1

1

1

1

r

0

1

1

1

1

1

f

0

1

1

1

1

1

a

0

1

1

2

2

2

e

0

1

1

2

2

3

由此表可知公共子序列长度为3,是aae

四、核心代码

int c[10001][10001];		//数组记录序列的最长公共子序列长度
int b[10001][10001];		//标记是递归关系中的哪一种情况 void LCS_num(int m,int n,char *X,char *Y){for(int i=1;i<=m;i++){	//首先当i=0或j=0时,代表有一个序列为空,所以c [i][j]=0c[i][0]=0;}for(int j=1;j<=n;j++){c[0][j]=0;}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(X[i-1]==Y[j-1]){				//当X序列的第i个元素和Y序列的第j个元素相等时 c[i][j]=c[i-1][j-1]+1;		//那么当前i元素一定再最长公共子序列里,长度+1 b[i][j]=1;					//b数组用来标记1,表示此情况}else if(c[i-1][j]>=c[i][j-1]){	//如果不相等,此时分两种情况进行比较 c[i][j]=c[i-1][j];		b[i][j]=2;				}else{					c[i][j]=c[i][j-1];b[i][j]=3;			}}}

五、记录与处理

实验数据及结果分析:

输入实例中的数据,与自行计算的结果一致,同时还输出了b数组,代表每个字符进行匹配的情况。

b数组标记1,表示X序列的第i个元素和Y序列的第j个元素相等;

b数组标记2,表示{X减去最后一个元素}与Y的最长公共子序列的序列较大;

b数组标记3,X与 {Y减去最后一个元素}的最长公共子序列的序列较大。

最长公共子序列为3,aae

六、思考与总结

动态规划算法通常分为以下几个步骤:

找出最优问题特点:明确问题的最优解具有什么样的性质,这是使用动态规划的前提。

定义递归关系:根据问题的最优子结构,建立子问题之间的递归关系,这是动态规划的核心。

自底向上计算每一步结果:利用递归关系,从最小的子问题开始,逐步求解更大的子问题,直到求解出原问题。

构造最优解:根据保存的中间结果,构造出原问题的最优解。

七、完整报告和成果文件提取链接

完整可运行代码以及相关实验报告以下链接可获取:
链接: https://pan.baidu.com/s/1iss6-C2nxZQGkEpo-WDn0A?pwd=g5cg 提取码: g5cg 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/67632.shtml

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

相关文章

动手学图神经网络(3):利用图神经网络进行节点分类 从理论到实践

利用图神经网络进行节点分类:从理论到实践 前言 在之前的学习中,大家对图神经网络有了初步的了解。本次教程将深入探讨如何运用图神经网络(GNNs)来解决节点分类问题。在节点分类任务里,大家往往仅掌握少量节点的真实标签,却要推断出其余所有节点的标签,这属于归纳式学…

单片机串口打印printf函数显示内容(固件库开发)

1.hal_usart.c 文件 #include <stdio.h> #include "hal_usart.h" #include "stm32F10x.h"//**要根据 使用的是哪个串口 对应修改 串口号 eg&#xff1a;USART1** void USART_PUTC(char ch) {/* 等待数据寄存器为空 */while((USART1->SR & …

网关登录校验

网关登录校验 单体架构时我们只需要完成一次用户登录、身份校验&#xff0c;就可以在所有业务中获取到用户信息。而微服务拆分后&#xff0c;每个微服务都独立部署&#xff0c;不再共享数据。也就意味着每个微服务都需要做登录校验&#xff0c;这显然不可取。 鉴权思路分析 …

wxwidgets直接获取系统图标,效果类似QFileIconProvider

目前只做了windows版本&#xff0c;用法类似QFileIconProvider // 头文件 #ifndef WXFILEICONPROVIDER_H #define WXFILEICONPROVIDER_H#include <wx/wx.h> #include <wx/icon.h> #include <wx/image.h> #include <wx/bmpcbox.h> // Include for wxB…

我的创作纪念日——成为创作者的 第365天(1年)

机缘 考研的结果让我感到一阵绝望&#xff0c;就像单片机突然死机一样&#xff0c;所有的努力像是被一场意外的中断指令打乱了逻辑流程。曾经本科时因为竞赛拿了一堆奖&#xff0c;内心充满虚荣心和成就感&#xff0c;总觉得自己是一个“天选之子”&#xff0c;但考研的失利却像…

React 封装高阶组件 做路由权限控制

React 高阶组件是什么 官方解释∶ 高阶组件&#xff08;HOC&#xff09;是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分&#xff0c;它是一种基于 React 的组合特性而形成的设计模式。 高阶组件&#xff08;HOC&#xff09;就是一个函数&…

【玩转全栈】--创建一个自己的vue项目

目录 vue介绍 创建vue项目 vue页面介绍 element-plus组件库 启动项目 vue介绍 Vue.js 是一款轻量级、易于上手的前端 JavaScript 框架&#xff0c;旨在简化用户界面的开发。它采用了响应式数据绑定和组件化的设计理念&#xff0c;使得开发者可以通过声明式的方式轻松管理数据和…

DS并查集(17)

文章目录 前言一、何为并查集&#xff1f;二、并查集的实现&#xff1f;并查集的初始化查找元素所在的集合判断两个元素是否在同一个集合合并两个元素所在的集合获取并查集中集合的个数并查集的路径压缩 三、来两道题练练手&#xff1f;省份的数量等式方程的可满足性 总结 前言…

Appium介绍

在使用不同版本的Appium包进行自动化测试时&#xff0c;出现警告问题可能是由于版本不兼容、配置不正确等原因导致的。下面将详细介绍解决这些问题的步骤&#xff0c;确保模拟器能够正常启动&#xff0c;并能在Appium查看器中同步显示。 1. 环境准备 首先&#xff0c;确保你已…

minimind - 从零开始训练小型语言模型

大语言模型&#xff08;LLM&#xff09;领域&#xff0c;如 GPT、LLaMA、GLM 等&#xff0c;虽然它们效果惊艳&#xff0c; 但动辄10 Bilion庞大的模型参数个人设备显存远不够训练&#xff0c;甚至推理困难。 几乎所有人都不会只满足于用Lora等方案fine-tuing大模型学会一些新的…

【C++动态规划 离散化】1626. 无矛盾的最佳球队|2027

本文涉及知识点 C动态规划 离散化 LeetCode1626. 无矛盾的最佳球队 假设你是球队的经理。对于即将到来的锦标赛&#xff0c;你想组合一支总体得分最高的球队。球队的得分是球队中所有球员的分数 总和 。 然而&#xff0c;球队中的矛盾会限制球员的发挥&#xff0c;所以必须选…

CSS 值和单位详解:从基础到实战

CSS 值和单位详解&#xff1a;从基础到实战 1. 什么是 CSS 的值&#xff1f;示例代码&#xff1a;使用颜色关键字和 RGB 函数 2. 数字、长度和百分比2.1 长度单位绝对长度单位相对长度单位 2.2 百分比 3. 颜色3.1 颜色关键字3.2 十六进制 RGB 值3.3 RGB 和 RGBA 值3.4 HSL 和 H…

Privacy Eraser,电脑隐私的终极清除者

Privacy Eraser 是一款专为保护用户隐私而设计的全能型软件&#xff0c;它不仅能够深度清理计算机中的各类隐私数据&#xff0c;还提供了多种系统优化工具&#xff0c;帮助用户提升设备的整体性能。通过这款软件&#xff0c;用户可以轻松清除浏览器历史记录、缓存文件、Cookie、…

Android 启动流程

一 Bootloader 阶段 在嵌入式系统中&#xff0c;Bootloader的引导过程与传统的PC环境有所不同&#xff0c;主要是因为嵌入式系统的硬件配置和应用场景更加多样化。以下是嵌入式系统中Bootloader被引导的一般流程&#xff1a; 1. 硬件复位 当嵌入式设备上电或复位时&#xff…

【数据结构与算法】AVL树的插入与删除实现详解

文章目录 前言Ⅰ. AVL树的定义Ⅱ. AVL树节点的定义Ⅲ. AVL树的插入Insert一、节点的插入二、插入的旋转① 新节点插入较高左子树的左侧&#xff08;左左&#xff09;&#xff1a;右单旋② 新节点插入较高右子树的右侧&#xff08;右右&#xff09;&#xff1a;左单旋③ 新节点插…

SCRM开发为企业提供全面客户管理解决方案与创新实践分享

内容概要 在当今的商业环境中&#xff0c;客户关系管理&#xff08;CRM&#xff09;变得越来越重要。而SCRM&#xff08;社交客户关系管理&#xff09;作为一种新兴的解决方案&#xff0c;正在帮助企业彻底改变与客户的互动方式。快鲸SCRM是一个引人注目的工具&#xff0c;它通…

AI应用部署——streamlit

如何把项目部署到一个具有公网ip地址的服务器上&#xff0c;让他人看到&#xff1f; 可以利用 streamlit 的社区云免费部署 1、生成requirements.txt文件 终端输入pip freeze > requirements.txt即可 requirements.txt里既包括自己安装过的库&#xff0c;也包括这些库的…

【C/C++】区分0、NULL和nullptr

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:C: 探索C编程精髓&#xff0c;打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 1. 0 和空指针 2. NULL 3. nullptr 总结 …

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.1 NumPy高级索引:布尔型与花式索引的底层原理

2.1 NumPy高级索引&#xff1a;布尔型与花式索引的底层原理 目录 #mermaid-svg-NpcC75NxxU2mkB3V {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NpcC75NxxU2mkB3V .error-icon{fill:#552222;}#mermaid-svg-NpcC75…

云原生(五十二) | DataGrip软件使用

文章目录 DataGrip软件使用 一、DataGrip基本使用 二、软件界面介绍 三、附件文件夹到项目中 四、DataGrip设置 五、SQL执行快捷键 DataGrip软件使用 一、DataGrip基本使用 1. 软件界面介绍 2. 附加文件夹到项目中【重要】 3. DataGrip配置 快捷键使用&#xff1a;C…