• POJ 2192 【DP】


    题意:

    给三个字符串,判断前两个在相对顺序不变的情况下是否可以组成第三个字符串。

    思路:

    先说屌丝:

    dp[i][j]代表1串的前i个和2串的前j个字符在3串的前i+j个字符中最多能够组合出几个字符。

    然后状态转移是:

    如果stra[i]==strc[i+j]则,dp[i][j]=max(dp[i][j],dp[i-1][j]+1)

    同样的若strb[i]==strc[i+j]则,dp[i][j]=max(dp[i][j],dp[i][j-1]+1)

    最后判断dp[lena][lenb]是否等于lena+lenb

    再说大神思路:

    大神直接把dp定义成bool型,初始化dp[0][0]=1;

    然后dp[i]][j]=dp[i-1][j]&&tmpa[i]==tmpc[i+j]||dp[i][j-1]&&tmpb[j]==tmpc[i+j]

    屌丝代码:

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int dp[205][205];
    int main()
    {
        int t;
        scanf("%d",&t);
        char tmpa[205],tmpb[205],tmpc[505];
        for(int tt=1; tt<=t; tt++)
        {
            memset(dp,0,sizeof(dp));
            scanf("%s%s%s",tmpa+1,tmpb+1,tmpc+1);
            int lena=strlen(tmpa+1);
            int lenb=strlen(tmpb+1);
            int lenc=strlen(tmpc+1);
            if(lena+lenb!=lenc)
            {
                printf("Data set %d: no
    ",tt);
            }
            else
            {
                for(int i=0; i<=lena; i++)
                {
                    for(int j=0; j<=lenb; j++)
                    {
                        if(i!=0)
                        {
                            if(tmpa[i]==tmpc[i+j])
                            {
                                dp[i][j]=dp[i-1][j]+1;
                            }
                            else
                            {
                                dp[i][j]=dp[i-1][j];
                            }
                        }
                        if(j!=0)
                        {
                            if(tmpb[j]==tmpc[i+j])
                            {
                                dp[i][j]=max(dp[i][j],dp[i][j-1]+1);
                            }
                            else
                            {
                                dp[i][j]=max(dp[i][j],dp[i][j-1]);
                            }
                        }
                    }
                }
                /*for(int i=0;i<=lena;i++)
                {
                    for(int j=0;j<=lenb;j++)
                    {
                        printf("%d ",dp[i][j]);
                    }
                    puts("");
                }*/
                if(dp[lena][lenb]==lenc)
                {
                    printf("Data set %d: yes
    ",tt);
                }
                else
                {
                    printf("Data set %d: no
    ",tt);
                }
            }
        }
    }
  • 相关阅读:
    缓存概念用法理解
    shiro
    Java生成验证码并进行验证(转)
    Java 8 Optional类深度解析(转)
    jdk8 stream可以与list,map等数据结构互相转换
    Java8初体验(二)Stream语法详解(转)
    Java 8 Optional 类
    cors跨域深刻理解
    httpclient连接池
    [C++] [算法] KMP算法
  • 原文地址:https://www.cnblogs.com/tun117/p/4905624.html
Copyright © 2020-2023  润新知