当前位置: 首页 > article >正文

AcWing 897. 最长公共子序列

动态规划就是多见识应用题就完事儿了,也没有什么好说的。
讲解参考:
【E05 线性DP 最长公共子序列】
在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<algorithm>
#define N 1010
using namespace std;
char a[N],b[N];
int n,m;
int f[N][N];
int main(){
    cin >> n >> m >> a + 1 >> b + 1 ;
    for(int i = 1; i <= n ; ++ i) {
        for(int j = 1; j <= m ; ++ j){
            if(a[i] == b[j]){
                f[i][j] = f[i - 1][j - 1] + 1;
            }else{
                f[i][j] = max(f[i - 1][j],f[i][j - 1]);
            }
        }
    }
    cout << f[n][m];
    return 0;
}

输出最长公共子序列的代码,(STL版)
Runtime环境:c++17

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>  // 用于 reverse 函数

using namespace std;

pair<int, string> lcs(const string& s1, const string& s2) {
    int m = s1.size();
    int n = s2.size();

    // 初始化 dp 数组
    vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));

    // 填充 dp 数组
    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++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]);
            }
        }
    }

    // 获取 LCS 的长度
    int lcs_length = dp[m][n];

    // 回溯找到 LCS 序列
    string lcs_seq;
    int i = m, j = n;
    while (i > 0 && j > 0) {
        if (s1[i - 1] == s2[j - 1]) {
            lcs_seq.push_back(s1[i - 1]);
            --i;
            --j;
        } else if (dp[i - 1][j] > dp[i][j - 1]) {
            --i;
        } else {
            --j;
        }
    }

    // 由于回溯是从最后开始的,所以需要反转字符串
    reverse(lcs_seq.begin(), lcs_seq.end());

    return {lcs_length, lcs_seq};
}

int main() {
    string s1 = "ABCBDABQ";
    string s2 = "BDCABQ";

    // 调用 LCS 函数
    auto [length, sequence] = lcs(s1, s2);

    // 输出结果
    cout << "最长公共子序列长度: " << length << endl;
    cout << "最长公共子序列: " << sequence << endl;

    return 0;
}

c版

#include<iostream>
#include<algorithm>
#define N 11
using namespace std;
char a[N],b[N];
int n,m;
int f[N][N];
char seq[N];
int main(){
    cin >> n >> m >> a + 1 >> b + 1 ;
    for(int i = 1; i <= n ; ++ i) {
        for(int j = 1; j <= m ; ++ j){
            f[i][j]=max(f[i-1][j],f[i][j-1]);
            if(a[i]==b[j]) f[i][j]=max(f[i][j],f[i-1][j-1]+1);
        }
    }
    cout << f[n][m] << endl;

    //最长子序列输出
    int i = n , j = m;
    string str;
    while(i&&j){
        if(a[i] == b[j]){
            str += a[i];
            i--,j--;
        }else if(f[i - 1][j] > f[i][j - 1]){
            i--;
        }else{
            j--;
        }
    }//不逆置字符串,直接逆序输出就完事儿了
    for(int i=str.size()-1;i>=0;--i)
        cout << str[i];
    return 0;
}

PS,输出最长子序列的代码我尝试了10位的两个,好像是正确的,输出长度的啃腚没问题,输出最长子序列是啥的没咋仔细验证过,是GPT生成的代码


http://www.kler.cn/a/284682.html

相关文章:

  • 如何进行产线高阶能耗数据的计算和可视化?
  • 「Mac玩转仓颉内测版12」PTA刷题篇3 - L1-003 个位数统计
  • python制作一个简单的端口扫描器,用于检测目标主机上指定端口的开放状态
  • Spring Boot实现文件上传与OSS集成:从基础到应用
  • 字节跳动Android面试题汇总及参考答案(80+面试题,持续更新)
  • 文件夹被占用了无法删除怎么办?强制粉碎文件夹你可以这样操作
  • JVM 内存参数
  • JetBrains WebStorm 2024.2 (macOS, Linux, Windows) - 最智能的 JavaScript IDE
  • 合宙LuatOS开发板使用手册——Air700EAQ
  • 图像边缘检测Canny
  • HTTP 之 Web Sockets处理恶意的Payload的策略(十一)
  • const、inline、nullptr的使用
  • Android Activity 的启动模式(Launch Mode)
  • Vue 2 vs Vue 3:v-if 和 v-for 的差异
  • 物流需求回复势头稳定,目前全国社会物流总额达197.7万亿元
  • 从零开学C++:vector类
  • 【MySQL索引】4索引优化
  • Django Compressor压缩静态文件(js/css)
  • 搭建双主四从的MySQL集群
  • 【大模型】LangChain基础学习
  • 某大厂前端面试题
  • 自然语言处理与深度学习的结合
  • Eureka简介与开发
  • Axure RP实战:打造高效文字点选验证码
  • 销冠大模型案例
  • (一) 初入MySQL 【认识和部署】