最长公共子序列

最长公共子序列(LCS)求解

1.包含头文件

#include<iostream>
#include<cstring>

2.定义全局变量

char a[200] = "ADABBD"; // 第一个字符串
char b[200] = "BDCDA";  // 第二个字符串
char f[201][201];      // 存储子问题的解:LCS长度
char p[201][201];      // 存储路径信息:1-左上,2-左,3-上
int m, n;              // 两个字符串的长度

3.LCS 函数:动态规划求解

void LCS() {
    int i, j;
    m = strlen(a);
    n = strlen(b);
    for (i = 1; i <= m; i++) {
        for (j = 1; j <= n; j++) {
            if (a[i-1] == b[j-1]) {
                f[i][j] = f[i-1][j-1] + 1;
                p[i][j] = 1; // 左上方向
            } else if (f[i][j-1] > f[i-1][j]) {
                f[i][j] = f[i][j-1];
                p[i][j] = 2; // 左方向
            } else {
                f[i][j] = f[i-1][j];
                p[i][j] = 3; // 上方向
            }
        }
    }
}

4.getLCS 函数:路径回溯

void getLCS() {
    int i, j, k;
    char s[200];
    i = m; j = n; k = f[m][n];
    s[k] = '\0'; // 字符串结束符
    while (i > 0 && j > 0) {
        if (p[i][j] == 1) {
            s[--k] = a[i-1];
            i--; j--;
        } else if (p[i][j] == 2) {
            j--;
        } else {
            i--;
        }
    }
    for (i = 0; i <= k; i++) {
        printf("%c", s[i]);
    }
}

5.主函数

int main() {
    LCS(); // 计算LCS长度并填充f和p数组
    printf("%d\n", f[m][n]); // 输出LCS长度
    getLCS(); // 输出LCS
    return 0;
}

总结

• 通过动态规划方法,构建了一个二维数组f来存储子问题的解,同时使用p数组记录路径信息。

• 利用p数组进行路径回溯,从f[m][n]开始,逐步构建出最长公共子序列。

• 这种方法有效地解决了最长公共子序列问题,是动态规划和路径回溯的经典应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值