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

这篇具有很好参考价值的文章主要介绍了算法动态规划之杂交水果取名问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个问题需要借鉴到动态规划中非常典型的:最大公共子序列问题的算法

【问题描述】

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

例如:输入以下3组水果名称: 

apple peach

ananas banana

pear peach

输出的新水果名称如下: 

appleach

bananas

pearch 

【提示】

本题目的思路是先求 arr1 arr2 字符串的最长公共子序列,基本过程参见《教程》第88.5节,再利用递归输出新水果取名。 

算法中设置二维动态规划数组dpdp[i][j]表示arr1[0..i-1]i个字母)和arr2[0..j-1]j个字母)中最长公共子序列的长度。另外设置二维数组bb[i][j]表示arr1arr2比较的3种情况

b[i][j]=0表示arr1[i-1]=arr2[j-1]

b[i][j]=1表示arr1[i-1]arr2[j-1]并且dp[i-1][j]>dp[i][j-1]

b[i][j]=2表示arr1[i-1]arr2[j-1]并且dp[i-1][j]dp[i][j-1] 

主要算法框架

void main( ) {

int t; //输入测试用例个数

printf("测试用例个数: ");

scanf("%d",&t);

while(t--) {

  scanf("%s",arr1);

scanf("%s",arr2);

memset(b,-1,sizeof(b));

m=strlen(arr1);    //m为arr1的长度

n=strlen(arr2);     //n为arr2的长度

LCSlength(  );     //求出dp, 并且给b[][]数组赋值 

printf("结果: ");

Output(m,n); //输出新水果取名

printf("\n");

}

}

void Output(int i, int j){  //利用递归输出新水果取名 

if (i==0 && j==0)  //输出完毕

return;

if(i==0) {       //arr1完毕,输出arr2的剩余部分 

Output(i,j-1);

printf("%c",arr2[j-1]);

return;

}

else if(j==0) {    //arr2完毕,输出arr1的剩余部分 

Output(i-1,j);

printf("%c",arr1[i-1]);

return;

}

if (b[i][j]==0) {    //arr1[i-1]=arr2[j-1]的情况 

Output(i-1,j-1);

printf("%c",arr1[i-1]);

return;

}

else if(b[i][j]==1) {  

Output(i-1,j);

printf("%c",arr1[i-1]);

return;

}

else{

 Output(i,j-1);

printf("%c",arr2[j-1]);

return;

}

}

源代码部分:文章来源地址https://www.toymoban.com/news/detail-492830.html

#include<bits/stdc++.h>
using namespace std;
#define MAX 51				//序列中最多的字符个数
//问题表示
int m,n;
string a,b;				//求解结果表示
int dp[MAX][MAX];			//动态规划数组
int bs[MAX][MAX];
vector<char> subs;			//存放LCS
void LCSlength()			//求dp
{  int i,j;
   for (i=0;i<=m;i++)			//将dp[i][0]置为0,边界条件
      dp[i][0]=0;
   for (j=0;j<=n;j++)			//将dp[0][j]置为0,边界条件   
      dp[0][j]=0;
   for (i=1;i<=m;i++)
      for (j=1;j<=n;j++)		//两重for循环处理a、b的所有字符
      {  if (a[i-1]==b[j-1]){
	  	dp[i][j]=dp[i-1][j-1]+1;
	  	bs[i][j]=0;
	  }
         else{
		 	dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
		 	if(dp[i-1][j]>dp[i][j-1]) bs[i][j]=1;
		 	else bs[i][j]=2;
		 }			
            
      }
}
void output(int i,int j){
	if(i==0 && j==0) return;
	if(i==0){
		output(i,j-1); cout<<b[j-1]; return;
	}
	else if(j==0){
		output(i-1,j); cout<<a[i-1]; return;
	}
	if(bs[i][j]==0){
		output(i-1,j-1);cout<<a[i-1];return;
	}
	else if(bs[i][j]==1){
		output(i-1,j);cout<<a[i-1];return;
	}
	else{
		output(i,j-1);cout<<b[j-1];return;
	}
}
int main(){
	cin>>a>>b;
	m=a.length();n=b.length();
	LCSlength();
	output(m,n);
	return 0;
}

到了这里,关于算法动态规划之杂交水果取名问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法学习17-动态规划01:背包问题

    提示:以下是本篇文章正文内容: 提示:这里对文章进行总结: 💕💕💕

    2024年04月27日
    浏览(53)
  • 动态规划算法:解决复杂问题的利器

    动态规划(Dynamic Programming)是一种高效解决复杂问题的算法方法,它通过将问题分解为子问题,并将子问题的解缓存起来,从而避免重复计算,提高计算效率。本文将介绍动态规划算法的原理、应用场景以及实际代码示例(Java)。 在计算机科学领域,算法是解决问题的方法

    2024年02月13日
    浏览(36)
  • C++算法 —— 动态规划(2)路径问题

    每一种算法都最好看完第一篇再去找要看的博客,因为这样会帮你梳理好思路,看接下来的博客也就更轻松了。当然,我也会尽量在写每一篇时都可以让不懂这个算法的人也能边看边理解。 动规的思路有五个步骤,且最好画图来理解细节,不要怕麻烦。当你开始画图,仔细阅

    2024年02月06日
    浏览(50)
  • 算法沉淀 —— 动态规划(子序列问题(上))

    几乎所有的动态规划问题大致可分为以下5个步骤,后续所有问题分析都将基于此 1.、状态表示:通常状态表示分为以下两种,其中更是第一种为主。 以i为结尾 ,dp[i] 表示什么,通常为代求问题(具体依题目而定) 以i为开始 ,dp[i]表示什么,通常为代求问题(具体依题目而

    2024年04月15日
    浏览(46)
  • 【算法优选】 动态规划之路径问题——贰

    动态规划相关题目都可以参考以下五个步骤进行解答: 状态表⽰ 状态转移⽅程 初始化 填表顺序 返回值 后面题的解答思路也将按照这五个步骤进行讲解。 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的

    2024年02月05日
    浏览(49)
  • 【算法】动态规划中的路径问题

    君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,如果给算法的难度和复杂度排一个排名,那么动态规划算法一定名列前茅。今天,我们通过由简单到困难的两道题目带大家学会动态规划中的路径问题 好了废话不多说,开始我

    2024年02月05日
    浏览(38)
  • 【算法】动态规划(dp问题),持续更新

    介绍本篇之前,我想先用人话叙述一般解决动态规划问题的思路: 动态规划的问题,本身有许多产生结果的可能,需要在具体题目下得到满足某个条件的解。 如何得到呢? 我们就需要根据这个具体问题,建立一个状态表( dp 表 ),在这张 dp 表中的每一个位置的数据都有明

    2024年02月04日
    浏览(49)
  • 背包问题算法全解析:动态规划和贪心算法详解

    计算机背包问题是动态规划算法中的经典问题。本文将从理论和实践两个方面深入探讨计算机背包问题,并通过实际案例分析,帮助读者更好地理解和应用该问题。 背包问题是一种经典的优化问题。有的时候我们需要将有一堆不同重量或者体积的物品放入背包,但是背包容量

    2024年02月09日
    浏览(49)
  • 资源分配问题【算法设计与分析】<动态规划问题>

    问题分析: ( 要把问题分为多步解决,每步求出子问题的多个最优策略后一步依赖于上一步的最有策略,最后一步得出问题的解) (1)首先要考虑分配给项目A的资金与利润的关系。得到此时投资数x与其相对应的 的关系。 (2)其次要考虑分配给前两个项目A,B的总资金 与利

    2023年04月08日
    浏览(39)
  • 基础算法之——【动态规划之路径问题】1

    今天更新动态规划路径问题1,后续会继续更新其他有关动态规划的问题!动态规划的路径问题,顾名思义,就是和路径相关的问题。当然,我们是从最简单的找路径开始! 动态规划的使用方法: 1.确定状态并定义状态数组:(i,j)代表什么意思?dp[i][j]又是什么意思? 2.确

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包