HDU 1503

来源:互联网 发布:艾姆赫斯特学院知乎 编辑:程序博客网 时间:2024/05/29 10:17

http://acm.hdu.edu.cn/showproblem.php?pid=1503

就是求出最长公共子序列,输出时最长序列只输出一次就行了。

#include <cstdio>#include <cstring>#include <iostream>#include <queue>#include <algorithm>#include <map>#include <vector>#include <stack>using namespace std;#define M 1005#define ll long long#define int64 __int64int dp[105][105];char ch1[105] , ch2[105] , str[105];void Solve(){int i , j;memset(dp , 0 , sizeof dp);int l1 = strlen(ch1+1) , l2 = strlen(ch2+1);for (i = 1 ; ch1[i] ; i++){for (j = 1 ; ch2[j] ; j++){if (ch1[i] == ch2[j]){dp[i][j] = dp[i-1][j-1]+1;}elsedp[i][j] = max(dp[i-1][j],dp[i][j-1]);}}int k = 0;i = l1;j = l2;while (i > 0 && j > 0){if (ch1[i] == ch2[j]){str[++k] = ch1[i];i--;j--;}else if (dp[i-1][j] > dp[i][j-1]){i--;}elsej--;}i = j = 1;while (i <= l1 || j <= l2){while (i <= l1 && ch1[i] != str[k])printf("%c",ch1[i++]);while (j <= l2 && ch2[j] != str[k])printf("%c",ch2[j++]);if (k)printf("%c",str[k--]);i++;j++;}putchar('\n');}int main(){while (~scanf("%s%s",ch1+1,ch2+1)){Solve();}return 0;}