新水果取名动态规划算法

新水果取名
题目内容:
两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含以前两种水果的字母,且名字尽量短,即:以前的水果名字arr1、arr2是新水果名arr的子序列,使用动态规划的思想设计算法得到新水果名arr。

输入格式:
以空格分开两个水果的名字

输出格式:
新水果的名字

输入样例:
apple peach

输出样例:
appleach

新序列是包含两个子序列(长度为m、n)的最短序列,最坏的情况是两个子序列没有共同元素直接连接,新序列长度最长为m+n。现在我们要做的是确定新序列的最短长度。设L(m,n)表示长度分别为m和n的子序列所构造的新序列的最短长度。a(m)表示子序列a的第m个字符,b(n)表示子序列b的第n个字符(都表示最后一个字符),若a(m)==b(n),说明最后一个字符相同,而且此字符必定位于新序列的末尾,那么新序列的最短长度就等于m-1和n-1的子序列构成的序列长度+1;若a(m)!=b(n),说明最后一个字符不同,那么最后一个字符就有两种排列方式,要么a(m)结尾,要么b(n)结尾,取两种结尾中的序列长度最小值再加1作为L(m,n)的值,依次类推构造动态规划函数。(另:L(m,0)=m,L(0,n)=n。因为当其中一个子序列为空,最短长度就是另一个子序列的长度)

仅有最短长度还是不够的,我们还要确定新序列的组成。若a(m)==b(n),说明新序列的最后一个字母就是a(m)或b(n);若a(m)!=b(n),说明新序列的最后字符取两者之一,若L(m,n)取值L(m-1,n)+1说明新序列取了a(m),反之取了b(n),我们利用一个二维数组status来记录字符的取向。

#include <iostream>
#include <algorithm>
using namespace std;
int main() {char a[20] = { 0 }, b[20] = { 0 }; //存储两个子序列int status[20][20] = { 0 }, num; //在寻求最短长度过程中记录字符组合char c[40] = { 0 }; //构造而出的新序列int m = 0, n = 0;cin >> a >> b;for (int i = 0; a[i] != '\0'; i++)m++;  //记录两个子序列长度m和nfor (int i = 0; b[i] != '\0'; i++)n++;int L[20][20], p, q;for (int i = 1; i <= m; i++)//初始化statusstatus[0][i] = 3;for (int i = 1; i <= m; i++)status[i][0] = 2;for (int i = 0; i <= m; i++)L[i][0] = i;for (int i = 0; i <= n; i++)//初始化L(m, n)L[0][i] = i;for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++) {if (a[i - 1] == b[j - 1]) {L[i][j] = L[i - 1][j - 1] + 1;status[i][j] = 1; //值为1表示字符可以任意取,下一步向左上移}else {p = L[i][j - 1] + 1;q = L[i - 1][j] + 1;L[i][j] = p > q ? q : p;if (p > q)status[i][j] = 2; //值为2表示字符来自第一个子序列,且下一步向上移elsestatus[i][j] = 3; //值为3表示字符来自第二个子序列,且下一步向左移}}num = L[m][n] - 1;/*for (int i = 0; i <= m; i++) {for (int j = 0; j <= n; j++)cout << L[i][j] << " ";cout << endl;}cout << endl;for (int i = 0; i <= m; i++) {for (int j = 0; j <= n; j++)cout << status[i][j] << " ";cout << endl;}*///可以取消此段注释查看L(m, n)和status的取值for (int i = m, j = n; i >= 0 && j >= 0;) {if (status[i][j] == 1) {c[num--] = a[i - 1];i--;j--;}else if (status[i][j] == 2) {c[num--] = a[i - 1];i--;}else if (status[i][j] == 3) {c[num--] = b[j - 1];j--;}elsebreak;}cout << c;
}

可能有人不太明白status的作用,在此上结果图。

图片的最上端是两个输入apple和peach,第一个矩阵是最短长度的矩阵,第二个矩阵是status矩阵,第一个矩阵的右下角数字就代表了新序列的长度,第二个矩阵同样是从右下角看起,数值为3,表示取第二个子序列的最后字符‘h’,且在status中向左进一格,同样为3,取第二个序列此时最后字符‘c’,再左进一格,仍为3,取‘a’,左进一格;此时数值为1,说明此字符任意取,而此时的第一序列apple和第二序列pe的最后字符也确实相等,取‘e’,再向左上进一格,值为2,所以取第一个子序列的最后字母‘l’,并向上进一格,依次类推,之后全取第一个序列的字母,直到前进到左上角值为0,此时新序列即为‘appleach’。

c++算法新水果取名相关推荐

  1. [算法]两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含了以前两种水果名字的字母,并且这个名字要尽量短。

    问题: 两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含了以前两种水果名字的字母,并且这个名字要尽量短.也就是说以前的一种水果名字arr1是新水果名字arr的子序列,另一种水果名字arr ...

  2. 新水果取名(动态规划,求两个子序列的最短原序列)

    题目内容: 两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含以前两种水果的字母,且名字尽量短,即:以前的水果名字arr1.arr2是新水果名arr12的子序列,使用动态规划的思想设计算法 ...

  3. 算法动态规划之杂交水果取名问题

    这个问题需要借鉴到动态规划中非常典型的:最大公共子序列问题的算法 [问题描述] 两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含了以前两种水果名字的字母,并且这个名字要尽量短.也就是说以 ...

  4. 。那为什么这种新语言取名为Python呢?

    Python之父荷兰人吉多 范·罗苏姆(Guido van Rossum) 在1989年圣诞节期间,在阿姆斯特丹,为了打发圣诞节的无聊时间, 决心开发一门解释程序语言.1991年第一个Python解释 ...

  5. 【图像检测】基于形态学算法实现水果蔬菜缺陷检测matlab代码

    1 简介 机器视觉是指利用图像建立一个现实世界中的物体的虚拟的模型.图像是将现实世界中的三维物体转换成二维信息,在这个过程中,许多有用的三维的信息被模糊掉,而实际应用中,很多时候需要用到这些被模糊掉的 ...

  6. 使用KNN算法对水果进行分类

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.pandas是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: ...

  7. python 生成数组1:1:20_英特尔“演化算法”新框架:29个Python代码块,自动生成新算法...

    点击上方 "码农真经" 关注,星标或者置顶 22点24分准时推送,第一时间送达 来源:公众号 新智元 | 编辑:真经君 码农真经(ID:coder_experience)第 133 ...

  8. 万元大奖,FlyAI算法新赛事,心理卡牌目标检测

    本文转自竞赛社区FlyAI最新上线算法赛. "心理卡牌目标检测算法赛"由测测星座与趣鸭心理联合发起的线上竞赛项目.2020年新冠肺炎疫情打破了我们平静的生活,影响了我们的身体健康和 ...

  9. Java企业面试算法新得体会之6大数据和空间限制问题6问

    整理一下以前面试大数据公司的新得体会 位运算一直都是 1.认识布隆过滤器 2.只用2GB内存在20亿个整数中找到出现次数最多的数 3.40亿个非负整数中找到没出现的数 4.找到100亿个URL中以及搜 ...

最新文章

  1. 狎昵关系和依恋情结辨诠
  2. linux grep find查找文件夹、代码中的某行/字符串
  3. 最长公共子序列Lcs 51Nod - 1006
  4. mysql主从异步复制_centos7mysql主从复制(默认异步)
  5. 发红包android
  6. android pay 绑定失败,实战Apple Pay失败!Android Pay你期待吗?
  7. 使用CDN引用jQuery
  8. 【转】Win32 Slider Control的用法
  9. mysql 连接查询 子查询 备份 笔记
  10. hook(钩子函数)
  11. waring Release版本
  12. 计算机无法启动printspooler,打印服务PrintSpooler无法启动解决方法
  13. 【一起入门NLP】中科院自然语言处理作业二:中英文语料训练CBOW模型获得词向量(pytorch实现)【代码+报告】
  14. 【PHP插件】Easypanel,PHP各版本For linux版 (集成zend和ioncube)
  15. 如何调教ChatGpt 让它听话
  16. 【MAX7800羽毛板更新固件及下载bug修复】
  17. swipecell样式_反馈组件 SwipeCell 滑动单元格 - 闪电教程JSRUN
  18. 【Java八股文之进阶篇(三)】多线程编程核心之锁框架(一)
  19. lisp获取qleader端点_中文版AutoCAD2013高手之道
  20. linux 系统睡眠.休眠命令

热门文章

  1. 2019年游戏行业的6个趋势
  2. 清空hive表 姿势大全
  3. 虚拟主机环境WinWebMail邮件系统的常见问题处理
  4. 游戏开发杂记(一) 万事开头难
  5. 架构师之路:粉丝关系链,10亿数据,如何设计?
  6. 科技英语翻译计算机化考试,《信息科技英语翻译》期末考试 A卷参考答案
  7. 做好音乐社区不全靠钱,也不能只为了钱
  8. Style Transfer for Anime Sketches with Enhanced Residual U-net and Auxiliary Classifier GAN
  9. 中美AI争高下的秘诀!一文看尽中国AI计算力发展
  10. 使用Cydia能干什么