hdu 1159 Common Subsequence(最长公共子序列)

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

题意

找出两个字符串的最长公共子序列的长度。

题解

最长公共子序列模板题。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1100;

int dp[N][N];
string s1, s2;

int LCS() {
    memset(dp, 0, sizeof dp);
    for (int i = 1; i <= s1.size(); i++)
        for (int j = 1; j <= s2.size(); j++)
            if (s1[i - 1] == s2[j - 1])
                dp[i][j] = dp[i - 1][j - 1] + 1;
            else
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);            
    return dp[s1.size()][s2.size()];
}

int main() {
    while (cin >> s1 >> s2)
        cout << LCS() << "\n";
}

输出方案

#include <bits/stdc++.h>
using namespace std;
const int N = 1100;

int dp[N][N];
string s1, s2;
int x[N][N], y[N][N];
char ch[N][N];

int LCS() {
    for (int i = 1; i <= s1.size(); i++)
        for (int j = 1; j <= s2.size(); j++)
            if (s1[i - 1] == s2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
                x[i][j] = i - 1;
                y[i][j] = j - 1;
                ch[i][j] = s1[i - 1];
            } else {
                if (dp[i - 1][j] >= dp[i][j - 1]) {
                    dp[i][j] = dp[i - 1][j];
                    x[i][j] = i - 1;
                    y[i][j] = j;
                } else {
                    dp[i][j] = dp[i][j - 1];
                    x[i][j] = i;
                    y[i][j] = j - 1;
                }
            }
    return dp[s1.size()][s2.size()];
}

void init() {
    memset(dp, 0, sizeof dp);
    memset(x, 0, sizeof x);
    memset(y, 0, sizeof y);
    memset(ch, 0, sizeof ch);
}

int main() {
    while (cin >> s1 >> s2) {
        init();
        cout << LCS() << "\n";
        int xx = s1.size(), yy = s2.size();
        string ans;
        vector<int> s1_id, s2_id;
        while (xx or yy) {
            if (ch[xx][yy]) {
                ans += ch[xx][yy];
                s1_id.push_back(xx);
                s2_id.push_back(yy);
            }
            int nx = x[xx][yy], ny = y[xx][yy];
            xx = nx, yy = ny;
        }
        reverse(ans.begin(), ans.end());
        reverse(s1_id.begin(), s1_id.end());
        reverse(s2_id.begin(), s2_id.end());
        for (int i = 0; i < s1_id.size(); i++)
            cout << s1_id[i] << " \n"[i == s1_id.size() - 1];
        for (int i = 0; i < s2_id.size(); i++)
            cout << s2_id[i] << " \n"[i == s2_id.size() - 1];
        cout << ans << "\n";
    }
}

 

posted @ 2020-06-09 22:00  Kanoon  阅读(156)  评论(0)    收藏  举报