c++算法新水果取名
新水果取名动态规划算法
新水果取名
题目内容:
两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含以前两种水果的字母,且名字尽量短,即:以前的水果名字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++算法新水果取名相关推荐
- [算法]两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含了以前两种水果名字的字母,并且这个名字要尽量短。
问题: 两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含了以前两种水果名字的字母,并且这个名字要尽量短.也就是说以前的一种水果名字arr1是新水果名字arr的子序列,另一种水果名字arr ...
- 新水果取名(动态规划,求两个子序列的最短原序列)
题目内容: 两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含以前两种水果的字母,且名字尽量短,即:以前的水果名字arr1.arr2是新水果名arr12的子序列,使用动态规划的思想设计算法 ...
- 算法动态规划之杂交水果取名问题
这个问题需要借鉴到动态规划中非常典型的:最大公共子序列问题的算法 [问题描述] 两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含了以前两种水果名字的字母,并且这个名字要尽量短.也就是说以 ...
- 。那为什么这种新语言取名为Python呢?
Python之父荷兰人吉多 范·罗苏姆(Guido van Rossum) 在1989年圣诞节期间,在阿姆斯特丹,为了打发圣诞节的无聊时间, 决心开发一门解释程序语言.1991年第一个Python解释 ...
- 【图像检测】基于形态学算法实现水果蔬菜缺陷检测matlab代码
1 简介 机器视觉是指利用图像建立一个现实世界中的物体的虚拟的模型.图像是将现实世界中的三维物体转换成二维信息,在这个过程中,许多有用的三维的信息被模糊掉,而实际应用中,很多时候需要用到这些被模糊掉的 ...
- 使用KNN算法对水果进行分类
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.pandas是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: ...
- python 生成数组1:1:20_英特尔“演化算法”新框架:29个Python代码块,自动生成新算法...
点击上方 "码农真经" 关注,星标或者置顶 22点24分准时推送,第一时间送达 来源:公众号 新智元 | 编辑:真经君 码农真经(ID:coder_experience)第 133 ...
- 万元大奖,FlyAI算法新赛事,心理卡牌目标检测
本文转自竞赛社区FlyAI最新上线算法赛. "心理卡牌目标检测算法赛"由测测星座与趣鸭心理联合发起的线上竞赛项目.2020年新冠肺炎疫情打破了我们平静的生活,影响了我们的身体健康和 ...
- Java企业面试算法新得体会之6大数据和空间限制问题6问
整理一下以前面试大数据公司的新得体会 位运算一直都是 1.认识布隆过滤器 2.只用2GB内存在20亿个整数中找到出现次数最多的数 3.40亿个非负整数中找到没出现的数 4.找到100亿个URL中以及搜 ...
最新文章
- 狎昵关系和依恋情结辨诠
- linux grep find查找文件夹、代码中的某行/字符串
- 最长公共子序列Lcs 51Nod - 1006
- mysql主从异步复制_centos7mysql主从复制(默认异步)
- 发红包android
- android pay 绑定失败,实战Apple Pay失败!Android Pay你期待吗?
- 使用CDN引用jQuery
- 【转】Win32 Slider Control的用法
- mysql 连接查询 子查询 备份 笔记
- hook(钩子函数)
- waring Release版本
- 计算机无法启动printspooler,打印服务PrintSpooler无法启动解决方法
- 【一起入门NLP】中科院自然语言处理作业二:中英文语料训练CBOW模型获得词向量(pytorch实现)【代码+报告】
- 【PHP插件】Easypanel,PHP各版本For linux版 (集成zend和ioncube)
- 如何调教ChatGpt 让它听话
- 【MAX7800羽毛板更新固件及下载bug修复】
- swipecell样式_反馈组件 SwipeCell 滑动单元格 - 闪电教程JSRUN
- 【Java八股文之进阶篇(三)】多线程编程核心之锁框架(一)
- lisp获取qleader端点_中文版AutoCAD2013高手之道
- linux 系统睡眠.休眠命令