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

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

输出格式:
新水果的名字

设计思想
采用动态规划的思想。根据题意,我是目标是求解2个子序列(FruitA,FruitB)的最短原序列(Fruit)。该如何实现呢?
1,求解出两种水果名(FruitA,FruitB)最长公共子序列。
使用动态规划的思想,算法思想是学习的另一位博主的文章,附上链接。
https://blog.csdn.net/hrn1216/article/details/51534607
2,在FruitA的基础上拼接FruitB中不是公共子序列的字符。
拼接方法:
(1),FruitA+FruitB中公共子序列最后一个字符后的字符
(2),FruitA+FruitB中公共子系列之间的字符,如下形式
ace
abde
acbde
(3),FruitB中公共子序列第一个字符前的字符+FruitA

#include<iostream>
#include<string>
using namespace std;
int main() {string FruitA, FruitB, Fruit;cin >> FruitA >> FruitB;int m = FruitA.size();int n = FruitB.size();//分配辅助数组空间int** assist = new int* [m+1];for (int i = 0; i <= m; i++)assist[i] = new int[n+1];//初始化辅助数组for (int i = 0; i <= m; i++)assist[i][0] = 0;for (int i = 1; i <= n; i++)assist[0][i] = 0;//填充辅助数组for(int i=1;i<=m;i++)for (int j = 1; j <= n; j++) {if (FruitA[i - 1] == FruitB[j - 1])assist[i][j] = assist[i - 1][j - 1] + 1;elseassist[i][j] = assist[i - 1][j] >= assist[i][j - 1] ? assist[i - 1][j] : assist[i][j - 1];}int legth = assist[m][n];    //子序列长度int* p = new int[legth];    //FruitA子序列下标int* q = new int[legth];  //FruitB子序列下标int k = legth - 1;            //由后向前记录下标//分别用p,q记录记录FruitA,FruitB中子序列下标for (int i = m, j = n; i > 0 && j > 0;) {if (assist[i][j] == assist[i][j - 1]) {j--;continue;}else if (assist[i][j] == assist[i - 1][j]) {i--;continue;}else {p[k] = i;q[k--] = j;i--;j--;}}//用FruitA初始化Fruit并连接FruitB子序列后尾部Fruit = FruitA + FruitB.substr(q[legth - 1], n - q[legth - 1]);//连接子序列中间字符for (int i = legth - 1; i > 1;) {if (q[i] - 1 == q[i - 1])i--;else {Fruit.insert(p[i-1], FruitB.substr(q[i - 1], q[i] - q[i - 1] - 1));i--;}}//拼接FruitB子序列前头部Fruit = FruitB.substr(0, q[0] - 1) + Fruit;cout << Fruit;return 0;
}

新水果取名(动态规划,求两个子序列的最短原序列)相关推荐

  1. c++算法新水果取名

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

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

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

  3. java实现原数组根据下标分隔成两个子数组并且在原数组中交换两个子数组的位置...

    此类实现: 输出一行数组数据,根据输入的下标,以下标位置为结束,将原数组分割成两组子数组. 并交换两个子数组的位置,保持子数组中的元素序号不变. 如:原数组为7,9,8,5,3,2 以下标3为分割点, ...

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

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

  5. 动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )

    1.问题描述 给定一个字符串(序列),求该序列的最长的回文子序列. 2.分析 需要理解的几个概念: ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblo ...

  6. 动态规划:求两个字符串的最长公共子序列

    问题描述:求两个字符串的最长公共子序列. 思路:使用动态规划的思想,将问题分解为小的子问题. 假设两个字符串序列分别为:X{x0, x1, x2,......, xm}, Y{y0, y1, y2,. ...

  7. HDU 6625 three arrays 求两个序列异或最小值的排列(一个可以推广的正解

    目录 题意: 解析 原题描述 @(hdu 6625求两个序列异或最小值的排列) 题意: \(T(100)\)组,每组两个长度为\(n(100000)\)的排列,你可以将\(a[]\)和\(b[]\)随 ...

  8. 递归法:求两个串的最大公共子序列的长度

    问题:求两个串的最大公共子序列的长度 举例: 子串: abcgxs 与sabxfh 其最大公共子序列的为abx,长度为3 public class Zixulie {public static int ...

  9. 【一元多项式算法】设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接。设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中。

    [一元多项式算法]设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接.设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中. #include<s ...

最新文章

  1. 【知识星球】有三AI编程与开源框架正式开通
  2. [ZOJ 4024] Peak
  3. 学习ASP.NET Core Razor 编程系列十八——并发解决方案
  4. 【2018.5.12】模拟赛之三-ssl2415 连通块【并查集】
  5. iOS开发-自定义UIAlterView(iOS 7)
  6. java获取上周一_java 获取昨天,上个星期一,本月开始时间戳,怎么写呢?
  7. ipfs c++client
  8. html改变占位字符的颜色,使用CSS更改HTML5输入的占位符颜色
  9. spark SQL学习(认识spark SQL)
  10. sublime text3的一些小技巧记录(配gif图)
  11. Java基础---Java---IO流-----File 类、递归、删除一个带内容的目录、列出指定目录下文件夹、FilenameFilte
  12. js如何判断一个数组中是否有重复的值
  13. SQL Server索引 - 聚集索引、非聚集索引、非聚集唯一索引 第八篇
  14. 五年了,我在 CSDN 的两个一百万。
  15. 职能型、矩阵型、项目型组织结构的优缺点
  16. 【题解】洛谷P1661扩散(同LibreOJ10015) 曼哈顿距离最小生成树
  17. 从零一起学Spring Boot之LayIM项目长成记(二) LayIM初体验
  18. html图片向两边展开效果,通过CSS3 transform实现图片浏览的几种效果
  19. 测试中遇到的bug总结
  20. 【食品化学与营养】第二章 水的化学与营养 笔记

热门文章

  1. xp电脑如何链接无线网络连接服务器,台式xp电脑wifi受限怎么解决 xp系统台式机网络提示连接受限的解决办法...
  2. 电网经济和频率控制的多层,多时间尺度模型方法 Julia源代码,本文提出了一个覆盖所有控制时间尺度的多路动态网络模型 代码按照高水平文章复现
  3. 国产3G详细资费标准曝光 完整体验最低消费118元
  4. 计算机上是如何注明固态硬盘的,台式电脑分别如何安装SSD(固态硬盘)详细图文教程...
  5. php计算大乐透与双色球彩票算法
  6. 科学计算库——Numpy基础
  7. 女生转行互联网怎样拿高薪?南京校区小姐姐给出答案,软件测试16k成功上岸!
  8. 企业级无延时直播来了,用了就回不去了
  9. 从程序员到架构师,有捷径吗?
  10. 我的出版书籍之《系统架构设计:程序员向架构师转型之路》