标签:
apple peach ananas banana pear peach
appleach bananas pearch
题目意思就是找到一个最短序列,使a,b字符串都是这个序列里的,且前后顺序不变(不一定连续)
代码我也是不太懂,就不解释了
1 #include<cstdio> 2 #include<cstring> 3 int flag[110][110],dp[110][110],lena,lenb; 4 char a[110],b[110]; 5 void out(int x,int y) 6 { 7 if(x==0&&y==0) 8 { 9 return ; 10 } 11 else 12 { 13 if(flag[x][y] == 0) 14 { 15 out(x-1,y-1); 16 printf("%c",a[x-1]); 17 } 18 if(flag[x][y] == 1) 19 { 20 out(x-1,y); 21 printf("%c",a[x-1]); 22 } 23 if(flag[x][y] == -1) 24 { 25 out(x,y-1); 26 printf("%c",b[y-1]); 27 } 28 } 29 } 30 int main() 31 { 32 while(scanf("%s%s",&a,&b)!=EOF) 33 { 34 lena=strlen(a); 35 lenb=strlen(b); 36 37 int i,j; 38 memset(dp,0,sizeof(dp)); 39 for(i = 0 ; i < lena ; i++) 40 flag[i][0]=1; 41 for(i = 0 ; i < lenb ; i++) 42 flag[0][i]=-1; 43 for(i = 1 ; i <= lena ; i++) 44 { 45 for(j = 1 ; j <= lenb ; j++) 46 { 47 if(a[i-1] == b[j-1]) 48 { 49 dp[i][j]=dp[i-1][j-1]+1; 50 flag[i][j]=0; 51 } 52 53 else 54 { 55 if(dp[i-1][j] >= dp[i][j-1]) 56 { 57 dp[i][j]=dp[i-1][j]; 58 flag[i][j]=1; 59 } 60 else 61 { 62 dp[i][j]=dp[i][j-1]; 63 flag[i][j]=-1; 64 } 65 } 66 } 67 } 68 out(lena,lenb); 69 printf("\n"); 70 } 71 }
标签:
原文地址:http://www.cnblogs.com/yexiaozi/p/5767186.html