HDU 1503
阿新 • • 發佈:2018-12-10
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1503 題意:給了兩個字串,找出它們的最長公共子序列和剩下的兩部分拼接後的串 分析:利用LCS過程,標誌出兩個串不同長度時的狀態,再回溯,逆向輸出結果 程式碼:
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> using namespace std; const int maxn = 110; typedef long long ll; char s1[maxn],s2[maxn]; int dp[maxn][maxn],mark[maxn][maxn]; void work(int len1,int len2) { for(int i = 0; i <= len1; i++) mark[i][0] = 1; for(int i = 0; i <= len2; i++) mark[0][i] = -1; for(int i = 1; i <= len1; i++) { for(int j = 1; j <= len2; j++) { if(s1[i - 1] == s2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; mark[i][j] = 0; } else if(dp[i][j - 1] >= dp[i - 1][j]) { dp[i][j] = dp[i][j - 1]; mark[i][j] = -1; } else { dp[i][j] = dp[i - 1][j]; mark[i][j] = 1; } } } } void printlcs(int len1,int len2) { //printf("1\n"); if(!len1 && !len2) return; if(mark[len1][len2] == 0) { printlcs(len1 - 1,len2 - 1); printf("%c",s1[len1 - 1]); } else if(mark[len1][len2] == -1) { printlcs(len1,len2 - 1); printf("%c",s2[len2 - 1]); } else { printlcs(len1 - 1,len2); printf("%c",s1[len1 - 1]); } } int main() { int n,len1,len2; while(~scanf("%s%s",s1,s2)) { memset(dp,0,sizeof(dp)); len1 = strlen(s1); len2 = strlen(s2); work(len1,len2); printlcs(len1,len2); printf("\n"); } return 0; }