• 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);
                }
            }
        }
    }
  • 相关阅读:
    spring cloud-zuul的Filter详解
    Hibernate day01
    JAVA中几种常用的RPC框架介绍
    乐观锁和悲观锁的区别(最全面的分析)
    Redis、Memcache和MongoDB的区别
    Hessian整合Spring
    Hessian的使用以及理解
    sso单点登录系统原理与实现
    zookeeper原理(转)
    Nginx的负载均衡的几种方式
  • 原文地址:https://www.cnblogs.com/tun117/p/4905624.html
Copyright © 2020-2023  润新知