动态规划算法求解水果杂交问题

Posted CCYQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划算法求解水果杂交问题相关的知识,希望对你有一定的参考价值。

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


输入格式:


以空格分开两个水果的名字


输出格式:


新水果的名字


输入样例:


apple peach


输出样例:


appleach

#include<cstdio>#include<cstring>using namespace std;
int LSC[1000][1000];int path[1000][1000];char str1[1000],str2[1000];
void getLSC(){ int len1=strlen(str1),len2=strlen(str2); for(int i=0;i<len1;i++){ for(int j=0;j<len2;j++){ if(str1[i]==str2[j]){ LSC[i+1][j+1]=LSC[i][j]+1; path[i+1][j+1]=1; } else if(LSC[i+1][j]>=LSC[i][j+1]){ LSC[i+1][j+1]=LSC[i+1][j]; path[i+1][j+1]=2; } else{ LSC[i+1][j+1]=LSC[i][j+1]; path[i+1][j+1]=3; } } }}

void outputPath(int m,int n){ if(m==0&&n==0) return; if(m==0){ outputPath(m,n-1); printf("%c",str2[n-1]); return; } if(n==0){ outputPath(m-1,n); printf("%c",str1[m-1]); return; } if(path[m][n]==1){ outputPath(m-1,n-1); printf("%c",str1[m-1]); } else if(path[m][n]==2){ outputPath(m,n-1); printf("%c",str2[n-1]); } else if(path[m][n]==3){ outputPath(m-1,n); printf("%c",str1[m-1]); }}
int main(){ memset(LSC,0,sizeof(LSC)); memset(path,0,sizeof(path)); scanf("%s %s",str1,str2);
int len1=strlen(str1),len2=strlen(str2); getLSC(); outputPath(len1,len2); return 0;}


以上是关于动态规划算法求解水果杂交问题的主要内容,如果未能解决你的问题,请参考以下文章

《算法导论》中动态规划求解钢条切割问题

VRP问题基于matlab遗传算法求解受灾期间的多中心车辆路径规划问题含Matlab源码 2353期

背包问题(动态规划)

算法导论-动态规划原理

算法分析实验 3. 基于动态规划方法求解0-1背包问题

算法之动态规划(递推求解一)