hdu 1503(最长公共子序列的升级版)

来源:互联网 发布:python def的作用 编辑:程序博客网 时间:2024/05/29 03:04

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503

思路:如何求最长公共子序列就不说了,另外如果有str2[j]==str1[i],那就mark[i]=j,相当于一个标记。

 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 111 7 int dp[MAXN][MAXN]; 8 char str1[MAXN],str2[MAXN]; 9 int mark[MAXN];10 int path[MAXN][MAXN];11 int len1,len2;12 13 int main(){14     while(~scanf("%s%s",str1,str2)){15         len1=strlen(str1);16         len2=strlen(str2);17         memset(dp,0,sizeof(dp));18         memset(path,0,sizeof(path));19         memset(mark,-1,sizeof(mark));20         for(int i=1;i<=len1;i++){21             for(int j=1;j<=len2;j++){22                 if(str1[i-1]==str2[j-1]){23                     dp[i][j]=dp[i-1][j-1]+1;24                 }else if(dp[i-1][j]>dp[i][j-1]){25                     dp[i][j]=dp[i-1][j];26                     path[i][j]=1;27                 }else {28                     dp[i][j]=dp[i][j-1];29                     path[i][j]=2;30                 }31             }32         }33         for(int i=len1,j=len2;i>=1&&j>=1;){34             if(path[i][j]==0){35                 i--,j--;36                 mark[i]=j;37             }else if(path[i][j]==1){38                 i--;39             }else 40                 j--;41         }42         int k=0;43         for(int i=0;i<len1;i++){44             if(mark[i]==-1){45                 printf("%c",str1[i]);46             }else {47                 for(int j=k;j<=mark[i];j++){48                     printf("%c",str2[j]);49                 }50                 k=mark[i]+1;51             }52         }53         for(int j=k;j<len2;j++)printf("%c",str2[j]);54         puts("");55     }56     return 0;57 }58 59             60 61 62 63         
View Code

 

 

0 0