文章

6

粉丝

58

获赞

0

访问

3.5k

头像
最长公共子序列LCS 题解:
P1874 复旦大学机试题
发布于2024年3月19日 21:31
阅读数 745

经典问题两字符串比较的升级版本

动态规划数组dp[i][j][k]存储的是字符串a[0...i-1]b[0...j-1]c[0...k-1]的最长公共子序列。

#include <iostream>
#include <string>
using namespace std;

int main() {
    // 从标准输入读取三个字符串
    string a, b, c;
    cin >> a >> b >> c;

    // 计算每个字符串的长度
    int lena = a.size();
    int lenb = b.size();
    int lenc = c.size();

    // 创建三维动态规划数组,用于存储到当前位置为止的最长公共子序列
    string dp[lena+1][lenb+1][lenc+1];
    
    // 初始化动态规划数组的边界条件
    dp[0][0][0] = "";

    // 使用三重循环遍历所有可能的字符串组合
    for (int i = 1; i <= lena; i++) {
        for (int j = 1; j <= lenb; j++) {
            for (int k = 1; k <= lenc; k++) {
                // 如果当前字符在三个字符串中都相同,则将此字符添加到序列中
                if (a[i - 1] == b[j - 1] && b[j - 1] == c[k - 1]) {
                    dp[i][j][k] = dp[i - 1][j - 1][k - 1] + a[i - 1];
                } else {
                    // 否则,选择前一个状态中最长的子序列
                    int l1 = dp[i - 1][j][k].size();
              ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发