zoukankan      html  css  js  c++  java
  • 类似LCS,构成目标单词(POJ2192)

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

    解题报告:

    1、类似最长公共子序列,dp[i][j]表示用s1前i个字符和s2前j个字符来构成目标单词的一部分,是否成功

    2、状态转移方程:

    if(i>0&&s3[i+j-1]==s1[i-1]&&dp[i-1][j])
        dp[i][j]=1;
    if(j>0&&s3[i+j-1]==s2[j-1]&&dp[i][j-1])
        dp[i][j]=1;
    /*#include <iostream>
    #include <cstdio>
    #include <string.h>
    using namespace std;
    
    int main()
    {
        int dp[210][210];
        char s1[210],s2[210],s3[410];
        int t,n,len1,len2,i,j;
        scanf("%d",&n);
        for(t=1; t<=n; t++)
        {
            scanf("%s%s%s",s1,s2,s3);
            len1=strlen(s1);
            len2=strlen(s2);
            memset(dp,0,sizeof(dp));
            dp[0][0]=1;
            for(i=0; i<=len1; i++)
            {
                for(j=0; j<=len2; j++)
                {
                    if(i>0 && s3[i+j-1]==s1[i-1] && dp[i-1][j])
                    {
                        dp[i][j]=1;
                    }
                    if(j>0 && s3[i+j-1]==s2[j-1] && dp[i][j-1])
                    {
                        dp[i][j]=1;
                    }
                }
            }
            if(dp[len1][len2])
            {
                printf("Data set %d: yes
    ",t);
            }
            else
            {
                printf("Data set %d: no
    ",t);
            }
        }
        return 0;
    }
    */
    
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
        int Case=1;
        int t;
        scanf("%d",&t);
        while(t--)
        {
    
            char s1[205],s2[205],s3[410];
            scanf("%s%s%s",s1,s2,s3);
            int dp[205][205];///dp[i][j]表示s1前i个字符和s2前j个字符是否可以构成当前的一部分s3;
    
            int len1,len2;
            len1=strlen(s1);
            len2=strlen(s2);
    
            memset(dp,0,sizeof(dp));
    
            dp[0][0]=1;
            for(int i=0; i<=len1; i++)
            {
                for(int j=0; j<=len2; j++)
                {
                    if(i>0&&s3[i+j-1]==s1[i-1]&&dp[i-1][j])
                        dp[i][j]=1;
                    if(j>0&&s3[i+j-1]==s2[j-1]&&dp[i][j-1])
                        dp[i][j]=1;
                }
            }
    
            if(dp[len1][len2]==1)
                printf("Data set %d: yes
    ",Case++);
            else printf("Data set %d: no
    ",Case++);
        }
        return 0;
    }
  • 相关阅读:
    [转]SVN服务器搭建和使用(二)
    [转]SVN服务器搭建和使用(一)
    BZOJ 2049 Sdoi2008 Cave 洞穴勘测
    BZOJ 1589 Usaco2008 Dec Trick or Treat on the Farm 采集糖果
    BZOJ 2796 POI2012 Fibonacci Representation
    BZOJ 2115 Wc2011 Xor
    BZOJ 3105 CQOI2013 新Nim游戏
    BZOJ 2460 Beijing2011 元素
    BZOJ 3687 简单题
    BZOJ 1068 SCOI2008 压缩
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5375223.html
Copyright © 2011-2022 走看看