vlambda博客
学习文章列表

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

两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含以前两种水果的字母,且名字尽量短,即:以前的水果名字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;}