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;
    }
  • 相关阅读:
    Tire树的理解和应用
    C语言:socket简单模拟http请求
    C语言:关于socket的基础知识点
    php中的ip2long和long2ip的理解
    理解php中的pack/unpack/ord/chr
    zlog学习笔记(mdc)
    计算机工作的进行
    期末总结
    第十四周学习报告
    第十三周学习报告
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5375223.html
Copyright © 2011-2022 走看看