lcs问题

CYTing CYTing     2022-08-31     411

关键词:

//动态规划(Dynamic programming)的最长公共子序列问题(Longest common subsequence)
//原理参考《算法导论》书
import java.util.Scanner;

public class LCS {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String s1=sc.nextLine();
        String s2=sc.nextLine();
        int len1=s1.length();
        int len2=s2.length();
        int c[][]=new int[len1+1][len2+1];
        int b[][]=new int[len1+1][len2+1];
        for(int i=0;i<=len1;i++){
            for(int j=0;j<=len2;j++){
                if(i==0||j==0){
                    c[i][j]=0;
                }else if(s1.charAt(i-1)==s2.charAt(j-1)){
                    c[i][j]=c[i-1][j-1]+1;
                    b[i][j]=1;//表示左向上箭头
                }else if(c[i-1][j]>=c[i][j-1]){
                    c[i][j]=c[i-1][j];
                    b[i][j]=2;//表示↑
                }else{
                    c[i][j]=c[i][j-1];
                    b[i][j]=3;//表示←
                }
            }
        }
        //直接输出表c,c[i,j]表示Xi和Yj的LCS的长度
        /*
        for(int i=0;i<=len1;i++){
            for(int j=0;j<=len2;j++){
                System.out.print(c[i][j]+" ");
            }
            System.out.println();
        }
        */
        
        //直接输出表b,b[i,j]表示子问题最优解的指向
        /*
        for(int i=0;i<=len1;i++){
            for(int j=0;j<=len2;j++){
                System.out.print(b[i][j]+" ");
            }
            System.out.println();
        }
        */
        
        System.out.println(c[len1][len2]);
        printLCS(b,s1,len1,len2);//调用方法printLCS,打印LCS的元素
        sc.close();
    }
    
    /**
     * 封装一个方法,打印LCS的元素(利用递归过程,逆序依次打印)
     * @param b 子问题最优解的指向
     * @param str 一个输入序列X
     * @param m 输入序列X的长度
     * @param n 输入序列Y的长度
     */
    public static void printLCS(int b[][],String str,int m,int n){
                if(m==0||n==0){
                    return;
                }
                if(b[m][n]==1){
                    printLCS(b,str,m-1,n-1);
                    System.out.print(str.charAt(m-1)+" ");
                }else if(b[m][n]==2){
                    printLCS(b,str,m-1,n);
                }else{
                    printLCS(b,str,m,n-1);
                }//直接用递归,之前用了for循环,一直输出好多元素.....
    }
}

 

lcs问题

最长公共子序列问题1。这里pre数组表示回溯的方式,状态转移方程!!!#include<iostream>#include<algorithm>#include<cmath>#include<vector>#include<string>#include<cstring>#pragmawarning(disable:4996) 查看详情

lcs问题

...amic programming)的最长公共子序列问题(Longest common subsequence)//原理参考《算法导论》书importjava.util.Scanner;publicclassLCS{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.... 查看详情

[luogup1439]排列lcs问题(dp+树状数组)

传送门 无重复元素的LCS问题n2做法不说了。 nlogn做法——因为LCS问题求的是公共子序列,顺序不影响答案,影响答案的只是两个串的元素是否相同,所以可以交换元素位置。首先简化一下问题,假设P1恰好为单调递... 查看详情

lcs问题

最长公共子序列问题核心代码:for(inti=1;i<=len1;i++)for(intj=1;j<=len2;j++){if(s1[i-1]==s2[j-1])dp[i][j]=dp[i-1][j-1]+1;elsedp[i][j]=max(dp[i-1][j],dp[i][j-1]);}UVA10405 LongestCommonSubsequence模板题代码:#inc 查看详情

最长公共子序列-lcs问题(lcs与lis在特殊条件下的转换)[洛谷1439]

...50%的数据,n≤1000对于100%的数据,n≤100000思路常见的LCS问题是通过O(n2)的DP解决的,显然此题的数据是过不去的如何想办法?这里就要参考在特殊条 查看详情

LCS 上的主要压缩

...标题】:majorcompactiononLCS【发布时间】:2019-10-1816:42:04【问题描述】:我在Cassandra集群中有LCS表。我也观察到集群中可能有墓碑,所以我决定减少GC宽限秒并执行主要压缩。运行nodetoolcompact键空间表,但压缩作业在一秒钟内运行... 查看详情

[洛谷p1439]排列lcs问题

题目大意:给你两个1~n的排列,求他们的LCS。解题思路:由于是1~n的排列,每个数会且只会出现1次。我们可以把一个序列映射成1,2,3,4……然后将另一个序列按照这个映射进行改变。由于前一个序列已经有序,那么后... 查看详情

最长公共子序列(lcs)问题

最长公共子串(LongestCommonSubstirng)和最长公共子序列(LongestCommonSubsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的... 查看详情

最长公共子序列问题lcs

最长公共子序列问题LCS  问题描写叙述:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说。若给定序列X= {x1,x2,…,xm},则还有一序列Z={z1,z2,…,zk}是X的子序列是指存在一个严格递增的下标序列... 查看详情

lcs求最长公共子序列(dp)

动态规划并不是一种算法,而是一种解决问题的思路。典型的动态规划问题,如最长公共子序列(LCS),最长单调子序列(LIS)等。动态规划分为四个步骤:1.判断问题是否具有最优子结构这里以LCS为例,X={x1,x2,...,xi};Y={y1,y2,...... 查看详情

洛谷p1439排列lcs问题

P1439排列LCS问题题目描述给出1-n的两个排列P1和P2,求它们的最长公共子序列。输入输出格式输入格式: 第一行是一个数n,接下来两行,每行为n个数,为自然数1-n的一个排列。 输出格式: 一个数,即最长公共子序列... 查看详情

hdu1243最长公共子序列(lcs)

原题地址题目分析这道题基本上是在普通LCS问题上的一点小小的变形,由求LCS的长度,改为求LCS的权值。架构还是不变的。可作为LCS问题的模板题。时间复杂度O(N^2)。注意题目中的字母都是小写字母,也就是仅仅有26种字符。不... 查看详情

[睡前小dp]序列相似性问题lcs和lis(代码片段)

LCS问题LCS:最长公共子序列,表示序列L和J最长公共的子序列长度。计算LCS的经典方法是时间复杂度为O(n*m)的dp。不妨设dp[i][j]=LCS(L[0~i],J[0~j]),这样能够得到递推公式:dp[i][j]=0(i=0orj=0)dp[i][j]=dp[i-1][j-1]+1(Li==Jj)dp[i][j]=max(dp[i-1][j],dp[i]... 查看详情

经典问题lcs(最大公共子串问题)c代码实现

LCS(LongestCommonsSequence)问题,也就是最长公共子串问题,是一个经典的算法问题。该问题在很多地方都会遇到。关于这个问题的解决方案,目前最佳的实现就是使用动态规划的方式进行实现,关于使用动... 查看详情

hdu-1159commonsubsequence(dp中的lcs问题)

CommonSubsequenceTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):38425    AcceptedSubmission(s):17634ProblemDescri 查看详情

使用 DP 查找 LCS

...文标题】:FindingLCSusingDP【发布时间】:2017-12-1605:21:43【问题描述】:我使用动态编程来找到最长的公共子序列b/w两个字符串。代码有什么问题。为什么它总是给出答案为0?#include<bits/stdc++.h>usingnamespacestd;intdp[20][20];voidinitial... 查看详情

最长公共子串和最长公共子序列(lcs问题)

一、区别给定两个字符串,求LCS 最长公共子串(LongestCommonSubstring):要求是连续的字符串最长公共子序列(LongestCommonSubsequence):要求子字符串相对顺序不变即可 二、动态规划求解 1、最长公共子串   给... 查看详情

lcs(详解)(代码片段)

一,问题描述给定两个字符串,求解这两个字符串的最长公共子序列(LongestCommonSequence)。比如字符串1:BDCABA;字符串2:ABCBDAB则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA 二,算法求解这是一个动态... 查看详情