hdu1243 最长公共子序列(LCS)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu1243 最长公共子序列(LCS)相关的知识,希望对你有一定的参考价值。

原题地址

题目分析

这道题基本上是在普通LCS问题上的一点小小的变形,由求LCS的长度,改为求LCS的权值。架构还是不变的。可作为LCS问题的模板题。时间复杂度O(N^2)。

注意

题目中的字母都是小写字母,也就是仅仅有26种字符。

不须要开太大的数组。

所以hash就是非常好的一种保存权值的方法。另外吐槽一下。

子弹序列和恐怖分子序列的长度太坑了,由于题目没有给出长度。

我开了个2000个数组,wa了n次。改成2005就AC了。

fuck。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[2005][2005];
char s[30],m[2005],k[2005];
int b[30];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        scanf("%s",s);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&b[s[i]-‘a‘]);
        }
        scanf("%s%s",m,k);
        int n1=strlen(m);
        int n2=strlen(k);
        memset(dp,0,sizeof(int)*(n1+1));
        for(int i=0;i<=n2;i++)
            dp[0][i]=0;
        for(int i=1;i<=n1;i++)
        {
            for(int j=1;j<=n2;j++)
            {
                if(m[i-1]==k[j-1])
                    dp[i][j]=dp[i-1][j-1]+b[m[i-1]-‘a‘];
                else 
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        printf("%d\n",dp[n1][n2]);
    }
}

解读

memset那句。就是给第0行清0。

m保存子弹序列,k保存恐怖分子序列。n1,n2各自是他们的长度。

dp[i][j]保留的是m[i-1]和k[j-1]的最大分数。所以终于的结果会保留在dp[n1][n2]中。


以上是关于hdu1243 最长公共子序列(LCS)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 6774 String Distance(最长公共子序列 LCS)

hdu 1159 Common Subsequence(dp 最长公共子序列问题LCS)

hdu1159-Common Subsequence(DP:最长公共子序列LCS)

HDU 1513 Palindrome:LCS(最长公共子序列)or 记忆化搜索

LCS(最长公共子序列)

HDU 1159 Common Subsequence (LCS)