博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 最长公共子序列测试 【LCS+回溯】
阅读量:7287 次
发布时间:2019-06-30

本文共 1438 字,大约阅读时间需要 4 分钟。

输入
第1行:字符串A第2行:字符串B(A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入示例
abcicbaabdkscab
输出示例
abca
这道题比较6,但是利用每个位置的记录进行回溯就更6,好好体会下。
#include #include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
//#define LOACL#define space " "using namespace std;//typedef long long Long;//typedef __int64 Int;typedef pair
paii;const int INF = 0x3f3f3f3f;const double ESP = 1e-6;const double PI = acos(-1.0);const int MOD = 1e9 + 7;const int MAXN = 1000 + 5;char str1[MAXN], str2[MAXN];int dp[MAXN][MAXN], vis[MAXN][MAXN];void print(int x, int y) { if (x == 0 || y == 0) return; if (vis[x][y] == 1) { print(x - 1, y - 1); printf("%c", str1[x - 1]); } else if (vis[x][y] == 2) { print(x - 1, y); } else { print(x, y - 1); }}int main() { while (scanf("%s%s", &str1, &str2) != EOF) { int cnt = 0, t = 0; int len1 = strlen(str1); int len2 = strlen(str2); memset(dp, 0, sizeof(dp)); memset(vis, 0, sizeof(vis)); for (int i = 1;i <= len1; i++) { for (int j = 1; j <= len2; j++) { if (str1[i - 1] == str2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; vis[i][j] = 1; } else if (dp[i - 1][j] > dp[i][j - 1]){ dp[i][j] = dp[i - 1][j]; vis[i][j] = 2; } else { dp[i][j] = dp[i][j - 1]; vis[i][j] = 3; } } } print(len1, len2); printf("\n"); } return 0;}

 

 

 

转载于:https://www.cnblogs.com/cniwoq/p/6770799.html

你可能感兴趣的文章
NC-ERP IUFO系统管理要点
查看>>
linux下将文件设置为swap
查看>>
jquery filter()方法
查看>>
make和makefile
查看>>
eclipse git 强制覆盖本地文件
查看>>
elasticsearch查询关键字slop
查看>>
[Unity3d]Player Settings导出设置
查看>>
Python成长之路第一篇(2)-初识列表和元组
查看>>
Docker EE/Docker CE简介与版本规划
查看>>
python 读取excel中的数据
查看>>
(转)java.util.zip.ZipException
查看>>
CENTOS 设置文件夹打开方式:在同一窗口打开文件夹
查看>>
ubuntu 64 装db2 v9.7 server
查看>>
顶级操作系统会议——2009年SOSP会议概况介绍
查看>>
display:table-cell实现两栏自适应布局
查看>>
mysql 读写分离mysql-proxy 代理
查看>>
httpd+tomcat(3) -- mod_jk
查看>>
MySQL:卸载、安装MySQL8.***
查看>>
CentOS 7安装Docker及常用命令
查看>>
VMware Workstation 7.0中文版下载
查看>>