算法程序设计 之 胖男孩问题(7/8)

news2024/9/29 9:29:16

一、题目分析

问题描述

麦克结婚后,在上个月他胖了70磅。因为手指上的脂肪过多,使他连给他最亲密的朋友斯拉夫克写一个电子邮件都很困难。

每晚麦克都详细地描述那一天他所吃的所有东西,但有时当他只想按一次某键时往往会按了不止一次,并且他的胖手指还会碰到他不想要按的键,麦克也知道自己的手指有问题,因此他在打字的时候很小心,以确保每打一个想要的字符时误打的字符不超过3个,误打的字符可能在正确字符之前也可能在其之后。

当斯拉夫克多次收到读不懂的电子邮件后,他总是要求麦克将电子邮件发3遍,使他容易读懂一点。

问题分析

  本题要求解三个序列的最长公共子序列。

二、功能的设计与思路

根据题意,麦克每打一个想要的字符时,误打的字符不超过3个,误打的字符可能在正确字符之前也可能在其之后。因此,两个正确的字符之间最多间隔六个错误的字符。用f[i][j][k]表示三个字符串到达[i][j][k]位置时的最长字符,如果ijk位置的字符相同,从[i-7][j-7][k-7]的位置开始循环,求出此间最长公共子序列,再加上当前的字符即可。

求最长公共子序列,在应用分治思想,将大问题分解成几个部分之后,因为对同样问题的重复计算,即递归效率太低,故采用动态规划,其具体步骤为:

Step1:找出最优解的性质,并刻划其结 构特征。

Step2:递归地定义最优值。

Step3:以自底向上的方式计算出最优值。

Step4:根据计算最优值时得到的信息,构造最优解。

  • 算法设计与分析

假设S1= {1…n},S2 = {1…m}(m,n不一定相等,C= {1…i}是最长公共子串。

如果S1[n] = S2[m],则有S1[n] = S2[m] = C[i];所以 C[1…i] = C[1…i-1] +1;

如果S1[n] != S2[m],分三种情况讨论:

S1[n] = C[i],S2[m] != C[i], 所以C是S2={1…m-1}的子串。

S1[n] != C[i],S2[m] = C[i], 所以C是S1={1…n-1}的子串。

S1[n] != C[i],S2[m] != C[i], 所以C是S2={1…m-1}与S1={1…n-1}的子串。

所以C{1…i} = Max最长子串(S1={1…n-1},S2={1…m})或者是Max最长子串(S1={1…n},S2={1…m-1});

换句话说就是最长公共子串的子串一定是原字符串的某子串的最长公共子串。如果设LCS(S1,S2,i,j)表示S1[1…i]和S2[1…j]的最长公共子序列的长度,则有:

if(S1[i,j] ==S2[i,j])

C[i,j] = LCS(S1,S2,i-1,j-1);

else

C[i,j] = Max(LCS(S1,S2,i-1,j),LCS(S1,S2,i,j-1));


若用c[i][j]记录两个序列的最长公共子序列的长度。其递归结构公式为:

但是就本题而言需要对三个序列求解公共子序列,所以得对上诉结构公式进行推广

f[i][j][l]表示第一个字符串的前i个字符与第二个字符串的前j个字符以及第三个字符串前l个字符组成的最长公共子序列。

接着,我们可以得出以下结论:

(1)当i,j,l任意一者等于0时,f[i][j][l]=0。(前0个,也就是没有嘛)

(2)当A[i-1]==B[j-1]&&B[j-1]==C[l-1]时(A,B,C分别表示三个字符串),f[i][j][l]就等于A的前i-1个字符,B的前j-1个字符,C的前l-1个字符组成的最长公共子序列+1,即f[i][j][l]=f[i-1][j-1][l-1]+1。

(3)若以上两种情况都不满足,我们就可以在以下几种情况中求最大值

<1>f[i-1][j][l]

<2>f[i][j-1][l]

<3>f[i][j][-1l]

<4>f[i-1][j-1][l]

<5>f[i-1][j][l-1]

<6>f[i][j-1][l-1]

<7>f[i-1][j-1][l-1]

       简单的来说,就是看哪种情况的最长公共子序列最长。

若用f[i][j][l]记录序列a和b和c的最长公共子序列的长度。

据此性质得到其递归结构的伪代码为

for (int i=1;i<=lena;i++)

        for (int j=1;j<=lenb;j++)

            for (int l=1;l<=lenc;l++)

      f[i][j][l]="";

    for (int i=1;i<=lena;i++)

        for (int j=1;j<=lenb;j++)

            for (int k=1;k<=lenc;k++)

                if (a[i]==b[j]&&b[j]==c[k]){

                    f[i][j][k]=a[i];

                    for (int x=max(0,i-7);x<i;x++)

                        for (int y=max(0,j-7);y<j;y++)

                            for (int z=max(0,k-7);z<k;z++)

                        if (f[i][j][k].size()<=f[x][y][z].size()+1)

                            f[i][j][k]=f[x][y][z]+a[i];

                if (ans.size()<=f[i][j][k].size())

                    ans=f[i][j][k];

                }

    cout<<ans<<endl;

  • 代码实现

#include<iostream>

#include<algorithm>

#include<cstdio>

#include<string>

using namespace std;

const int N=105;

string f[N][N][N],a,b,c,ans="";

int g[N][N]={0};

int main()

{

      int lena,lenb,lenc;

      cin>>a>>b>>c;

      lena=(int)a.size();

      lenb=(int)b.size();

      lenc=(int)c.size();

      a='0'+a;b='0'+b;c='0'+c;

      int i,j,k;

      for(i=1;i<=lena;i++)

            for(j=1;j<=lenb;j++)

                  for(k=1;k<=lenc;k++)

                       f[i][j][k]="";

      for(i=1;i<=lena;i++)

            for(j=1;j<=lenb;j++)

                  for(k=1;k<=lenc;k++)

                  {

                       if(a[i]==b[j]&&b[j]==c[k]) f[i][j][k]=a[i];

                       for(int x=max(0,i-7);x<i;x++)

                             for(int y=max(0,j-7);y<j;y++)

                                   for(int z=max(0,k-7);z<k;z++)

                                         if(f[i][j][k].size()<=f[x][y][z].size()+1)

                                               f[i][j][k]=f[x][y][z]+a[i];

                                         if(ans.size()<=f[i][j][k].size())

                                               ans=f[i][j][k];

                  }

                  cout<<ans<<endl;

                  return 0;

}

  • 运行结果与分析

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

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

相关文章

java 读取图片中的文字

Maven依赖导入Tess4j <!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j --><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.4</version></de…

基于SpringBoot的二手书交易系统的设计与实现(源码、数据库、文档)

作为新兴事物&#xff0c;校园电子商务是&#xff0c;首先是指在校园范围内&#xff0c;其技术手段是校园网&#xff0c;而服务对象是全部师生。主要经营形式为学生自主经营&#xff0c;能够满足多群体生活学习需求&#xff0c;同时具备范围小&#xff0c;安全性高&#xff0c;…

《Web应用技术》期末复习(END)

说明&#xff1a;不知道是哪位兄台在群里说了一句&#xff0c;整的我压力山大。这是我个人的期末复习梳理&#xff0c;自己使用并且提供给几位有需要的朋友使用&#xff0c;并不确定期末考试考不考这些。请大家视情况查看和使用&#xff0c;如果有错误&#xff0c;也欢迎大家找…

opencv如何使用GPU的三种方法

我在工作实验涉及到图像和视频处理时&#xff0c;通常使用opencv提供的库来做处理&#xff0c;虽然OpenCV是一个广泛使用的库&#xff0c;它提供了丰富的功能和工具。然而&#xff0c;有时候在处理大量图片或视频时&#xff0c;我们可能会面临速度受限的问题。 opencv执行图像…

SpringMvc拦截器入门

文章目录 前言五、拦截器入门1.拦截器简介2.拦截器入门案例3.拦截器参数4. 拦截器链配置 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能帮到一些萌新进行新技术的学习那也是极好的。作者…

管理Linux目录、用户、组以及文档的权限和归属

文章目录 一、管理Linux目录和文件1、查看及切换目录pwd&#xff1a;查看当前工作目录cd&#xff1a;切换工作目录ls&#xff1a;列出文档及属性alias&#xff1a;别名cat查看文件内容less分页显示长文件 2.新建目录/文件mkdir 创建目录touch创建文件 3.删除/移动/复制rm删除mv…

ai描述生成器绘画有哪些?ai绘画生成器描述介绍

从前&#xff0c;有一个名叫小华的画家&#xff0c;他是一位非常出色的艺术家&#xff0c;但是他总是感到自己还没有达到他理想中作品的水平。他一直在寻找一种方法来创造出高质量的艺术品。有一天&#xff0c;他听说了一种神奇的技术&#xff0c;可以让计算机通过人工智能生成…

MySQL全备+binlog恢复方法之伪装master

利用mysql全备 binlog server恢复方法之伪装master 单实例试验 一、试验环境 10.72.7.40 实例 mysql3306为要恢复的对象&#xff0c;mysql3306的全备binlog server&#xff08;目录/data/mysql/mysql3306/backup&#xff09; 实例mysql3307为伪装master 实例mysql3308为伪…

黑马程序员前端 Vue3 小兔鲜电商项目——(四)Home 页面布局

文章目录 Home 页面组件结构组件结构拆分Home 模块中引入组件 分类实现模板代码渲染数据 banner 轮播图实现模板代码封装接口渲染数据 面板组件封装创建公共组件复用抽取主题和副主题 新鲜好物实现模版代码封装接口渲染数据 人气推荐实现模板代码封装接口渲染数据 懒加载指令实…

Java实现加密(五)Base64编码

目录 一、Base64是怎么诞生的二、Base64定义三、Base64原理1.ASCII码转Base64&#xff08;字节数 % 3 0&#xff09;2.ASCII码转Base64&#xff08;字节数 % 3 2&#xff09;3.ASCII码转Base64&#xff08;字节数 % 3 1&#xff09;4.UTF-8转Base64 四、Java实现Base64编解码…

Android Binder通信原理(一):简介

源码基于&#xff1a;Android R 0. 前言 在Linux 系统中现有的进程间通信&#xff08;IPC&#xff09;方式&#xff1a; 管道(PIPE)&#xff1a;在创建时分配一个page大小的内存&#xff0c;缓存区大小比较有限&#xff1b;命名管道(FIFO)&#xff1a;考虑 PIPE_BUF 和原子操…

华为流程体系:IPD流程之敏捷开发(限制版)

目录 前言 敏捷 逐步采用敏捷原则 专栏列表 CSDN学院课程地址 前言 今天继续来谈谈 IPD 体系中敏捷开发所涉及的一些相关内容。 无论是硬件产品的开发过程&#xff0c;还是在应用或者是学习 IPD 的过程中。 瀑布式流程几乎都是标配。 这其实跟硬件产品或者是传统 IPD …

ROS:配置VScode

目录 前言一、下载二、vscode 安装三、vscode 集成 ROS 插件四、vscode 使用4.1 创建 ROS 工作空间4.2启动 vscode4.3vscode 中编译 ros4.4创建 ROS 功能包4.5C 实现4.6python 实现4.7配置 CMakeLists.txt4.8编译4.9执行 前言 VSCode 全称 Visual Studio Code&#xff0c;是微…

关于华为云服务器安装宝塔面板后,点击终端无响应解决方案

问题再现: 下面是我沟通宝塔客服后&#xff0c;给的解决方案。 我在百般无奈的情况下、卸载了宝塔后&#xff0c;最终躺平&#xff0c;选择了问宝塔官方客服 1、从华为提供的远程登录方式选一种 二、输入服务器密码通过ssh远程登录 服务器 二、执行宝塔官方提供的 命令执…

电影《闪电侠》观后感

上周看了电影《闪电侠》&#xff0c;主要是闪电侠这个人成长过程&#xff0c;与以往英雄题材类还是有些不太一样的&#xff0c;像之前蜘蛛侠和钢铁侠&#xff0c;都是讲主人公怎么成为那个英雄的&#xff0c;而本部电影是一个类似倒叙&#xff0c;他自己本身就已经是闪电侠了&a…

zookeeper安装使用及工作原理分析

1. Zookeeper概念简介 Zookeeper是一个分布式协调服务&#xff1b;就是为用户的分布式应用程序提供协调服务&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态&#xff0c;根据节点提交的反馈进行下一步合理操作。 具体介绍&#xff1a; A、zookeeper是为…

Electron详解(二):基本使用与项目打包

一、electron的基本使用 创建一个 electron 项目 在使用Electron进行开发之前&#xff0c;您需要安装 Node.js&#xff0c;最低工作版本为 14.x&#xff0c;低于 14 的版本在后面的打包过程中可能会报错。 &#xff08;注意&#xff0c;因为 Electron 将 Node.js 嵌入到其二…

嵌入式系统与大数据:选择哪个方向更好?

嵌入式系统和大数据是两个不同的领域&#xff0c;各有其独特的优势和发展前景。选择嵌入式系统还是大数据方向&#xff0c;应根据个人兴趣、技能背景以及市场需求进行综合评估。 嵌入式系统方向的优势&#xff1a;我资料有嵌入式、plc、单片机资料需要得可以私我 物联网&#…

在 ZBrush 中雕刻漫画风格的蝙蝠侠半身像

今天瑞云渲染小编给大家带来Rishikesh Nandlaskar分享蝙蝠侠造型背后的制作过程&#xff0c;解释了 ZBrush 和 Substance 3D Painter 中的工作流程&#xff0c;并分享了 Arnold 中的渲染设置。 介绍 我叫 Rishikesh Nandlaskar&#xff0c;是伦敦 Framestore VFX 工作室的高级…