Combine String---hdu5727 &&& Zipper(LCS变形)

题目链接:http://poj.org/problem?id=2192

http://acm.split.hdu.edu.cn/showproblem.php?pid=5707

http://acm.split.hdu.edu.cn/showproblem.php?pid=1501

这三道题除了输入输出格式不一样,其他都一样,意思是给你三个字符串,问你能不能由前两个组成第三个,要按顺序;

但是hdu5707和poj2192数据太水,直接判断字符个数,然后一个一个的判断先后顺序是否满足即可,但是这样是有bug的,例如cbe cadfg cabcdefg本来是No的,但是如果这样做的话就是yes;

作为一个比赛题出这样数据我也是醉了,就这样让学妹们水过了;

其实是最长公共子序列的一种变形;(刚开始的时候听别人这样说,我感觉怎么会呢,后来想想确实就是)

hdu1501用那种方法是过不了的,我们可以用dp[i][j]表示a的前i个字符和b的前j个字符是否能组合成c的前i+j个字符;所以最后只需判断dp[L1][L2]是否为1即可;

当c[i+j] = a[i] && c[i+j] = b[j] 时,dp[i][j]可以由dp[i-1][j]或者dp[i][j-1]的来,所以只要这两个有一个为真,dp[i][j]就为真;

其他两种情况也是这样推得;

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <map>
using namespace std;
#define N 1010
#define met(a, b) memset(a, b, sizeof(a))
#define INF 0x3f3f3f3f
#define LINF 10e16
typedef long long LL;

int dp[N][N];

int main()
{
    char a[N], b[N], c[N];
    int T, t = 1;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%s %s %s", a+1, b+1, c+1);

        printf("Data set %d: ", t++);

        met(dp, 0);

        int L1 = strlen(a+1), L2 = strlen(b+1), L3 = strlen(c+1);

        if(L1+L2 != L3)
        {
            puts("no");
            continue;
        }

        dp[0][0] = 1;

        for(int i=0; i<=L1; i++)
        {
            for(int j=0; j<=L2; j++)
            {
                if(i==0 && j==0)continue;

                if(c[i+j] == a[i] && c[i+j] == b[j])
                    dp[i][j] = dp[i-1][j] || dp[i][j-1];
                else if(c[i+j] == a[i])
                {
                    if(i == 0) dp[i][j] = 1;
                    else dp[i][j] = dp[i-1][j];
                }
                else if(c[i+j] == b[j])
                {
                    if(j == 0) dp[i][j] = 1;
                    else dp[i][j] = dp[i][j-1];
                }
            }
        }
        if(dp[L1][L2]) puts("yes");
        else puts("no");
    }
    return 0;
}

时间: 2024-11-01 14:12:55

Combine String---hdu5727 &&& Zipper(LCS变形)的相关文章

poj 1080 (LCS变形)

Human Gene Functions 题意: LCS: 设dp[i][j]为前i,j的最长公共序列长度: dp[i][j] = dp[i-1][j-1]+1;(a[i] == b[j]) dp[i][j] = max(dp[i][j-1],dp[i-1][j]); 边界:dp[0][j] = 0(j<b.size) ,dp[i][0] = 0(i< a.size); LCS变形: 设dp[i][j]为前i,j的最大价值: value(x, y)为比较价值: dp[i][j] = max(d

poj1080——lcs变形,dp

poj1080——lcs变形,dp Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17610   Accepted: 9821 Description It is well known that a human gene can be considered as a sequence, consisting of four nucleotides, which are simpl

使用System.IO.Combine(string path1, string path2, string path3)四个参数的重载函数提示`System.IO.Path.Combine(string, string, string, string)&#39; is inaccessible due to its protection level

今天用Unity5.5.1开发提取Assets目录的模块,使用时采用System.IO.Path.Combine(string, string, string, string)函数进行路径生成 明明是公有函数,为何会报错,奇了怪了 有谁知道什么原因?欢迎交流 ....... ... 重新打开了一下 ,可以了.版本原因 使用System.IO.Combine(string path1, string path2, string path3)四个参数的重载函数提示`System.IO.Path.Co

POJ 1080 Human Gene Functions(求两字符串相似度:LCS变形)

POJ 1080 Human Gene Functions(求两字符串相似度:LCS变形) http://poj.org/problem?id=1080 题意: HDU1080 给你两个由字符A,C,G,T构造的字符串s1和s2, 现在你可以在这两个字符串中插入空格, 使得两串长相等(但是不能使得s1的空格对应s2的空格位置). 然后给你s1的特定字符对应s2中特定字符所能获得的分数矩阵: 问你最后两个字符串所能获得的最大分数是多少? 分析: 本题很类似于求字符串最短编辑距离或者求字符串LCS的

UVA-1625-Color Length(DP LCS变形)

Color Length(UVA-1625)(DP LCS变形) 题目大意 输入两个长度分别为n,m(<5000)的颜色序列.要求按顺序合成同一个序列,即每次可以把一个序列开头的颜色放到新序列的尾部. https://odzkskevi.qnssl.com/a68cbd3e27f46b4f02ea12b7b1a1abca 然后产生的新序列中,对于每一个颜色c,都有出现的位置,L(c)表示最小位置和最大位置之差,求L(c)总和最小的新序列. 分析 LCS 是公共上升子序列,在动态转移的过程中,考虑

HDU 5707 Combine String (DP,LCS变形)

题意:给定三个字符串,问你第三个是不是由第一个和第二个组成的. 析:当时比赛是没有做出来啊...一直WA,就是没有判断长度,第一个和第二个和是不是和第三个一样,这个忘记... 我们用d[i][j]表示第一个字符串匹配到 i, 第二个匹配到第 j 个,然后只要判断能不能由上一个得到就好.这个主要是d[i][j]==1则表示可以成功匹配 d[i][j]==0则表示无法成功匹配,那么剩下的就简单了. 代码如下: #include <cstdio> #include <string> #i

Advanced Fruits(HDU 1503 LCS变形)

Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2358    Accepted Submission(s): 1201Special Judge Problem Description The company "21st Century Fruits" has specialized in cr

HDU 5791 Two ——(LCS变形)

感觉就是最长公共子序列的一个变形(虽然我也没做过LCS啦= =). 转移方程见代码吧.这里有一个要说的地方,如果a[i] == a[j]的时候,为什么不需要像不等于的时候那样减去一个dp[i-1][j-1]呢?其实是要减去的,然后我们注意+1是什么呢?这两个位置是相同的,那么这一对组合是1,然后包含这一个,在dp[i-1][j-1]中相同的又可以拿出来加一遍了,因此就抵消了~ 代码如下: 1 #include <stdio.h> 2 #include <algorithm> 3 #

hdu 1080(LCS变形)

Human Gene Functions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3008    Accepted Submission(s): 1701 Problem Description It is well known that a human gene can be considered as a sequence,