HDU 1159 Common Subsequence 最长公共子序列

题意

给你两个字符串,求出这两个字符串的最长公共子序列,这里的子序列不一定是连续的,只要满足前后关系就可以。

解题思路

这个当然要使用动态规划了。

这里\(dp[i][j]\)代表第一个串的前\(i\)个字符和第二个串的前\(j\)个字符中最长的公共子序列的最长长度,递推关系如下:

\[d[i][j]= \begin{cases} dp[i-1][j-1]+1 & \text{if} &str1[i]==str2[j] \\ max(dp[i-1][j], dp[i][j-1]) & \text{if } &str1[i]!=str2[j] \end{cases}
\]

优化:这里我们看到,每次的\(dp[i][j]\)的更新仅需要当前前一行\(dp[i-1][j-1]\),\(dp[i-1][j]\)的值还有当前行的\(dp[i][j-1]\)的值,所以我们可以进行空间优化,开辟空间为\(dp[maxn][2]\)

代码实现

//带有空间优化的
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1005;
int dp[maxn][2];
char s1[maxn], s2[maxn];
int main()
{
int len1, len2;
while(scanf("%s %s", s1+1, s2+1)!=EOF)
{
memset(dp, 0, sizeof(dp));
len1=strlen(s1+1);
len2=strlen(s2+1);
int flag=0;
for(int i=1; i<=len1; i++)
{
for(int j=1; j<=len2; j++)
{
if(s1[i]==s2[j])
dp[j][flag]=dp[j-1][!flag]+1;
else
dp[j][flag]=max(dp[j][!flag], dp[j-1][flag]);
}
flag=!flag;
}
printf("%d\n", dp[len2][!flag]);
}
return 0;
}
//没有空间优化的代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1005;
int dp[maxn][2];
char s1[maxn], s2[maxn];
int main()
{
int len1, len2;
while(scanf("%s %s", s1+1, s2+1)!=EOF)
{
memset(dp, 0, sizeof(dp));
len1=strlen(s1+1);
len2=strlen(s2+1);
int flag=0;
for(int i=1; i<=len1; i++)
{
for(int j=1; j<=len2; j++)
{
if(s1[i]==s2[j])
dp[j][i%2]=dp[j-1][(i-1)%2]+1;
else
dp[j][i%2]=max(dp[j][(i-1)%2], dp[j-1][i%2]);
}
}
printf("%d\n", dp[len2][len1%2]);
}
return 0;
}

HDU 1159 Common Subsequence 最长公共子序列的更多相关文章

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...

  2. C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解

    版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...

  3. POJ 1458 Common Subsequence(最长公共子序列LCS)

    POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...

  4. lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)

    Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i.j个字母的最长公共子序列 class Solution { public: int findLength ...

  5. LCS(Longest Common Subsequence 最长公共子序列)

    最长公共子序列 英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...

  6. LCS修改版(Longest Common Subsequence 最长公共子序列)

    题目描述 作为一名情报局特工,Nova君(2号)有着特殊的传达情报的技巧.为了避免被窃取情报,每次传达时,他都会发出两句旁人看来意义不明话,实际上暗号已经暗含其中.解密的方法很简单,分别从两句话里删掉 ...

  7. POJ 1458 Common Subsequence 最长公共子序列

    题目大意:求两个字符串的最长公共子序列 题目思路:dp[i][j] 表示第一个字符串前i位 和 第二个字符串前j位的最长公共子序列 #include<stdio.h> #include&l ...

  8. LCS(Longest Common Subsequence)最长公共子序列

    最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题.这与查找最长公共子串的问题不同的地方是:子序列不需要在原序列中占用连续的位置 .最长公共子序列问题是 ...

  9. PKU 1458 Common Subsequence(最长公共子序列,dp,简单)

    题目 同:ZJU 1733,HDU 1159 #include <stdio.h> #include <string.h> #include <algorithm> ...

随机推荐

  1. ID生成 雪花算法

    /** * ID生成 雪花算法 */ public class SnowFlake { public static SnowFlake getInstance() { return Singleton ...

  2. codefroces Round #201.B--Fixed Points

    B. Fixed Points time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  3. sqli-libs(3)

    今天我们来讲解 sqli-libs(3) 有括号的单引号报错  首先我们来查看加入'看报错了 在加‘’ 没报错 证明 存在注入 然后我们看加入’的报错回显的是什么 和我们的sqli-libs(1)的报 ...

  4. 分布式-网络通信-NIO

    目录:一.java NIO 和阻塞I/O的区别     1. 阻塞I/O通信模型     2. java NIO原理及通信模型二.java NIO服务端和客户端代码实现 一.java NIO 和阻塞I ...

  5. Java并发编程的艺术笔记(五)——Java中的锁

    一.Lock接口的几个功能: 显示的获取和释放锁 尝试非阻塞的获取锁 能被中断的获取锁 超时获取锁 使用方式: Lock lock = new ReentrantLock(); lock.lock() ...

  6. 查看线程的cpu占用率

    1)         top -H -p 进程pid 查看线程的线程ID与CPU占用情况.或者使用 ps -eLo pid,lwp,pcpu | grep 进程pid2)         pstack ...

  7. 20175215 2018-2019-2 第六周java课程学习总结

    第七章 内部类与异常类 1.内部类 Java支持在一个类中定义另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类 内部类和外嵌类之间重要关系如下 内部类的外嵌类的成员变量在内部类中仍然有 ...

  8. leetcode-easy-array-136. Single Number

    mycode   75.80% class Solution(object): def singleNumber(self, nums): """ :type nums: ...

  9. Linux搭建Samba共享服务器

    实验要求: Samba文件共享服务配置与访问,配置访问用户以及相应权限. Tips:创建共享目录/test和/share,并且分别在/test下创建文件tf1(只读)tf2(读写)  在/share ...

  10. Vue复杂路由器的实现

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...