动态规划之LCS(最大公共子序列)】的更多相关文章

#include <stdio.h> #include <string.h> int b[50][50]; int c[50][50]; int length = 0; void lcs(char *x, int m, char *y, int n) { int i; int j; for(i = 1; i <= m; i++) c[i][0] = 0; for(i = 1; i <= n; i++) c[0][i] = 0; for(i = 1; i <= m;…
一.Description A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a program which, given a string, determines the minimal number of characters to be inserted into…
抛出问题: 假定字符串 s1 = 'BDCABA', s2 = 'ABCBDAB',求s1和s2的最大公共子序列. 问题分析: 我们想要求出s1和s2的最大公共子序列,我们可以用c(i,j)表示s1(i)和s2(j)最大公共子序列的长度,  假定c(i,j) = m,      如果:s1[ i ]和s2[ j ]相等,那么推出c(i,j) = c(i-1,j-1)  + 1, 如果:s1[ i ] 和 s2[ j ]不相等,那么得到c(i,j) = max(c(i,j-1),c(i-1,j))…
在生物应用中,经常需要比较两个(或多个)不同生物体的DNA, 例如:某种生物的DNA可能为S1=ACCGGTCGAGTGCGCGGAAGCCGGCCGAA, 另一种生物的DNA可能为S2=GTCGTTCGGAATGCCGTTGCTCTGTAAA 我们比较两个DNA串的一个原因是希望确定它们的相似度,作为度量两种生物的近似程度指标 寻找第三个串S3,它所有碱基也都出现在S1和S2中,且三个串中的顺序都相同,但在S1和S2中不要求连续出现. 可以找到的S3越长,就可以认为S1和S2的相似度越高.在这…
在两个字符串中,有些字符会一样,可以形成的子序列也有可能相等,因此,长度最长的相等子序列便是两者间的最长公共字序列,其长度可以使用动态规划来求. 以s1={1,3,4,5,6,7,7,8},s2={3,5,7,4,8,6,7,8,2}为例. 借用<算法导论>中的推导图: 创建 DP数组C[][]; 图中的空白格子需要填上相应的数字(这个数字就是c[i][j]的定义,记录的LCS的长度值).填的规则依据递归公式,简单来说:如果横竖(i,j)对应的两个元素相等,该格子的值 = c[i-1,j-1]…
The company "21st Century Fruits" has specialized in creating new sorts of fruits by transferring genes from one fruit into the genome of another one. Most times this method doesn't work, but sometimes, in very rare cases, a new fruit emerges th…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1243 d[i][j] 代表第i 个字符与第 j 个字符的最大的得分.,, 最大公共子序列变形 #include <cstring> #include <cstdlib> #include <cstdio> #include <iostream> #include <algorithm> using namespace std; +; char s[max…
37-回文字符串 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:10 submit:17 题目描述: 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入描述: 第一行给出整数N(0<N<100) 接下来的N行,每行一个字…
题目链接: https://vjudge.net/problem/SPOJ-LCS 题意: 最多10行字符串 求最大公共子序列 数据范围: $1\leq |S| \leq100000$ 分析: 让他们都和第一个字符串匹配,算出每个字符串与第一个字符串的,以$i$位置(i指的是在s1中的位置)结尾匹配的最大长度 与其它字符串的匹配取最小值 最后对所有位置取最大值 超时代码:(题限是236ms,这个代码跑2000ms没问题) #include<bits/stdc++.h> #define ll l…
斐波拉契数列 首先我们来看看斐波拉契数列,这是一个大家都很熟悉的数列: // f = [1, 1, 2, 3, 5, 8] f(1) = 1; f(2) = 1; f(n) = f(n-1) + f(n -2); // n > 2 有了上面的公式,我们很容易写出计算f(n)的递归代码: function fibonacci_recursion(n) { if(n === 1 || n === 2) { return 1; } return fibonacci_recursion(n - 1) +…
题意:给你两个单词序列,求出他们的最长公共子序列. 多组数据输入,单词序列长度<=100,单词长度<=30 因为所有组成LCS的单词都是通过 a[i] == b[j] 更新的. 打印序列的时候用mark标记一下,然后回溯找就可以了. #include <iostream> #include <cstdio> #include <cstdlib> #include <vector> #include <map> #include <…
Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly…
描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于 第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间.因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗? 输入 第一行是一个整数T,表示输入数据一共有T组. 每组测试数据的第一行是一个整数N(1<=N<=5000),表示有N个木棒.接下来的一行分别输入N个木棒的L,W(0 < L ,W <…
Problem Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = <x1, x2, ..., xm> another sequence Z = <z1, z2, ..., zk> is a subsequence of X if there exists a stri…
巧妙的转化:f前两维大小开反TLE了一发…… 如果一个序列的相邻两项差的绝对值小于等于1,那么我们说这个序列是完美的. 给出一个有序数列A,求有多少种完美序列排序后和数列A相同. Input 第一行一个数n(<=30000)表示完美序列的长度 第二行n个数,表示数列A(每个数<=10^9,每个数出现次数<=100) Output 仅包含一个整数,表示可能的方案总数(对1,000,000,007取模) 题目分析 暑假讲过的题,今天第一眼还以为是什么玄妙计数…… 因为从左到右构造不现实,于是…
其中的算法思想只是较为简单的动态规划,过去各种各样的考试写过很多次C/C++版本的,最近开始用Python做leetcode中的题目时遇到了该题目,很常规的做法竟然得到了意想不到的速度,但内存占用较差,仅超过了5%左右,后边试试有没有更好的方法. 第一版code: def maxSubArray(self, nums: List[int]) -> int: d = [] d.append(nums[0]) max_ = nums[0] for i in range(1, len(nums)):…
单序列型DP 相比一维DP,这种类型状态转移与过去每个阶段的状态都有关. Longest Increasing Subsequence : 求最大最小值 Perfect Squares : 求某个规模值 Increasing Triplet Subsequence : 求是否存在 Coin Change : 求最大最小值 Integer Break : 求最大最小值 Largest Divisible Subset : 求最大最小值 Combination Sum IV : 求方法总数 Perf…
LCS的python实现: #!/usr/bin/env python #-*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') class LCS(object): """Long Common Subsequence算法 """ def __init__(self, str1, str2): self.s1 = str1 self.s2 = st…
#include "bits/stdc++.h" using namespace std; ],b[]; ][]; int main() { cin >> a >> b; int lena = strlen(a); int lenb = strlen(b); memset(num,, sizeof(num)); ;i <= lena;i++){ ;j <= lenb;j++){ ] == b[j-]) num[i][j] = num[i-][j-]+…
重温世界杯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8018    Accepted Submission(s): 2819 Problem Description 世界杯结束了,意大利人连本带利的收回了法国人6年前欠他们的债,捧起了大力神杯,成就了4星意大利.世界杯虽然结束了,但是这界世界杯给我们还是留下许多值得回忆的东西.比如…
先上状态转移方程,还是很容易看明白的 例题是Codevs的1862,这个题不是实现了方程就可以了的,还要完成一个事情那就是计数,数一数到底有多少个最长公共子序列 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; const int p=1e8; char a[maxn],b[maxn]; int dp[maxn][maxn],f[maxn][maxn]; int m…
最长公共子序列问题 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个. 输入示例 abcicba abdkscab 输出示例 abca 请选取你熟悉的语言,并在下面的代码框中完成你的程序,注意数据范围,最终结果会造成Int32溢出,这样会输出错误的答案. 不同语言如何处理输入输出,请查看下面的语言说明. #include <iostream> #include <cstring> #include &…
#include<cstdio> using namespace std; #define MOD 1004535809 int a[8001],f[1001][101],n,m,x,S; int main() { scanf("%d%d%d%d",&n,&m,&x,&S); for(int i=1;i<=S;++i) { scanf("%d",&a[i]); a[i]%=m; ++f[1][a[i]]; }…
1 NLP(自然语言处理) 1.1相似度 相似度和距离之间关系: 1.文本相似度: 1) 语义相似.但字面不相似: 老王的个人简介 铁王人物介绍 2) 字面相似.但是语义不相似: 我吃饱饭了 我吃不饱饭 2.方案: 1) 语义相似:依靠用户行为,最基本的方法:(1)基于共点击的行为(协同过滤),(2)借助回归算法 歌神 -> 张学友 2) 字面相似:(1) LCS最大公共子序列 (2) 利用中文分词 老王的个人简介 => 老王 / 的 / 个人 / 简介 token 3 字面相似的问题解决:…
function LCS(wordX, wordY) { var m = wordX.length; var n = wordY.length; this.lcs = function(){ var l = []; var path = []; var i, j, a, b; for(i = 0; i <= m; ++i) { l[i] = []; path[i] = []; for(j = 0; j <= n; j++) { l[i][j] = 0; path[i][j] = 0; } }…
From:http://my.oschina.net/leejun2005/blog/117167 1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题,可以用动态规划来求解.我们采用一个二维矩阵来记录中间的结果.这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是…
原文:算法起步之动态规划LCS 前一篇文章我们了解了什么是动态规划问题,这里我们再来看动态规划另一个经典问题,最长公共子序列问题(LCS),什么是子序列,我们定义:一个给定序列将其中的0个或者多个元素去掉之后得到的序列就是他的子序列.例如序列x包含(a,b,c,b,d,a,b)那么序列y(b,c,d,b)就是x的一个子序列.公共子序列则是两个序列的公共的子序列,而最长公共子序列则是从两个序列的公共子序列中挑选出长度最长的子序列. 我们用我们说的动态规划的四步来分析这个问题.一刻画最长公共子序列的…
1.问题描述 给定一个字符串(序列),求该序列的最长的回文子序列. 2.分析 需要理解的几个概念: ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblog/p/4321398.html这一篇文章描述了利用动态规划求解两个序列的最长公共子序列(Longest Common Sequence). 假设LCS(X,Y)表示序列X,Y的最长公共子序列,LPS(X)表示X的最长回文子序列: 在设序列X1为X的装置序列(逆序),比如X=“123”,X1=“32…
首先介绍一下LIS和LCS的DP解法O(N^2) LCS:两个有序序列a和b,求他们公共子序列的最大长度 我们定义一个数组DP[i][j],表示的是a的前i项和b的前j项的最大公共子序列的长度,那么由于是用迭代法,所以计算DP[i][j]前,DP[i-1][j]和DP[i][j-1]就都已经计算出来了,不难理解就可以得出状态转移方程: DP[i][j]  = DP[i-1][j-1] + 1;   如果a[i] == b[j] MAX(DP[i-1][j], DP[i][j-1])  如果a[i…
先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC.这里解决的问题就是需要一种算法可以快速的计算出这个最大的子序列,当然,用最简单的方法就是列出XY全部的子系列然后一个个对比,但这样的时间复杂度是绝对不能接受的.假设X的长度是m,Y的长度是n,拿X的一个子序列和Y进行对比的时间是n,计算X的全部子序列的时间是2^m,所以,如果采用的是一个个全部计算的话,将会花费n*2^m的时间,指数级别的时间复杂…