C++练习 | 最长公共字符串(DP)

HDU 1159.Common Subsequence

#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<string.h>
using namespace std;
int dp[10007][10007];//a的前i个字母与b的前j个字母的有序交集长度
int main()
{
    // freopen("01.in","r",stdin);
    string a,b;
    while(cin>>a>>b)
    {
        int m=a.length();
        int n=b.length();
        dp[0][0]=0;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(a[i]==b[j])
                {
                    if(j!=0&&i!=0)
                        dp[i][j]=dp[i-1][j-1]+1;
                    else
                        dp[i][j]=1;
                }
                else
                {
                    if(j!=0&&i!=0)
                    {
                        dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                    }
                    else if(i==0)
                    {
                        dp[i][j]=max(0,dp[i][j-1]);
                    }
                    else
                    {
                        dp[i][j]=max(0,dp[i-1][j]);
                    }
                }
            }
        }
        cout<<dp[m-1][n-1]<<endl;
    }
    return 0;
}

零点处理有些过于麻烦了,可以通过更改i,j初始值简化,但是懒得改了

不算太明白以后再看看

原文地址:https://www.cnblogs.com/tsj816523/p/11226583.html

时间: 2024-10-16 01:04:52

C++练习 | 最长公共字符串(DP)的相关文章

求字符串A与字符串B的最长公共字符串(JAVA)

思路:引入一个矩阵的思想,把字符串A(长度为m)当成矩阵的行,把字符串B(长度为n)当矩阵的列,这样就构成一个m*n的矩阵.若该矩阵的节点对应的字符相同,即m[i]=n[j]时,该节点值为1:当前字符相同节点的值 = 左上角(d[i-1, j-1])的值 +1,这样当前节点的值就是最大公用子串的长.只需以行号和最大值为条件即可截取最大子串. public String getLongest(String s1,String s2){ if(s1==null ||s2==null){ return

Java算法——求出两个字符串的最长公共字符串

问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别以行和列组成一个二维矩阵. 2.比较二维矩阵中行和列对应的每个点的字符是否相同,是设置这个点为1,否设置这个点为0. 3.通过查找值为1的最长对角线来找到最长公共字符串. 通过上面str1和str2两个字符串,分别得出以行和列组成的一个二维矩阵如下图: 从上图可以看到,str1和str2共有3个公共子串&qu

Acwing779 最长公共字符串后缀

题目大意:给定n个字符串,让你找到他们的最长公共字符串后缀是什么,可能为空. 分析:题目数据范围比较小,可以O(n*n)暴力匹配,即可解决这道问题.之所以写这道题的题解还是因为写字符串的题还不够多啊,菜的一批. 代码: #include<bits/stdc++.h> using namespace std; string common(string s,string t) { int most = 0; int len = min(s.length(), t.length()); for (i

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25416    Accepted Submission(s): 11276 Problem Description A subsequence of

hdu 1159 common sequence (最长公共子序列 dp)

http://acm.hdu.edu.cn/showproblem.php?pid=1159 题意 : 给出两个字符串 求出最长公共子序列 思路: if(str1[i]==str2[j]) { dp[i][j]=max(dp[i-1][j-1]+1,max(dp[i-1][j],dp[i][j-1])); } else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); #include<cstdio> #include<cstring> #include&l

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

lcs(最长公共子序列) 求两个序列的lcs的长度,子序列可不连续 dp[i][j]=dp[i-1][j-1]+1(a[i]==b[i]) dp[i][j]=max(dp[i-1][j],dp[i][j-1])(a[i]!=b[i]) memset(dp,0,sizeof(dp)); for(int i=1;i<=n1;i++){ for(int j=1;j<=n2;j++){ if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(

最长公共子序列 DP

算法老师的作业,一道dp基础题,给你两个序列,问你最长公共子序列是什么,比如:(a,b)是(a,c,d,b)的子序列.注意不是最长公共子串,这里的子序列可以不连续. 两个for循环就出来了,每一个dp[i][j]可以从dp[i-1][j-1].dp[i-1][j].dp[i][j-1]三种情况更新过来,取个最大的,然后把路径用123存下来,最后再顺着路径找然后逆序输出就行. sample input: 7 4 A B C B D A B B C D B 7 6 A B C B D A B B D

bzoj3304[Shoi2005]带限制的最长公共子序列 DP

题意:给出三个序列,求出前两个的公共子序列,且包含第三个序列,要求长度最长. 这道题目怎么做呢,f[i][j]表示a串1-i,b串1-j的最长,g[i][j]表示a串i-n,b串j-m最长, 那么只需要判断中间有没有包好c串就OK了,这样都是O(n^2)的. #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include&l

求最长公共子序列-DP问题

Longest common subsequence problem The longest common subsequence (LCS) problem is the problem of finding the longest subsequence common to all sequences in a set of sequences (often just two sequences). It differs from the longest common substring p