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;
    }
  • 相关阅读:
    JavaWeb——库存管理系统(1)jsp部分---18.12.13
    Java——多线程---18.11.22
    Java——异常处理---18.11.14
    Java——final代码块是否一定被执行---18.11.08
    暑期的周总结们
    Javaweb——四则运算---18.11.01
    Java——equals方法---18.10.18
    微信小程序记账本进度六
    微信小程序记账本进度七
    微信小程序记账本进度一
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5375223.html
Copyright © 2011-2022 走看看