zoukankan      html  css  js  c++  java
  • hdu 6170 Two strings(dp)

    多校比赛时,我被题意杀了.这里的*指的是可以重复前面字符任意多次,甚至可以删去自己和前面的字符,即重复0次.考试的时候不知道,结果咸鱼了.

    首先dp思维很简单f[i][j]表示s前i个和t前j个能否匹配,三种转移

    1.直接匹配,由f[i-1][j-1]直接转移过来

    2.*替换字符,由f[i-1][j]转移过来

    3.删除*或*和前面的字符,由f[i-1][j]或f[i-2][j]转移过来

    初始化时注意一个细节

    s=空串

    t=a*

    这两个实际是可以匹配的.

    然后这题就没什么了

    贴代码:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int LEN=2510;
    char s[LEN],t[LEN];
    bool f[LEN][LEN];
    int ttt,lens,lent;
    inline bool check(const int &i,const int &j){
        return s[i]==t[j]||t[j]=='.';
    }
    void prework(){
        scanf("%s%s",s+1,t+1);
        lens=strlen(s+1); 
        lent=strlen(t+1);
        memset(f,0,sizeof(f));
    }
    int main(){
        scanf("%d",&ttt);
        while (ttt--){
            prework();
            f[0][0]=1;
            if (t[2]=='*') f[0][2]=1;
            for (int i=1; i<=lens; i++)
            for (int j=1; j<=lent; j++){
                if (check(i,j)) f[i][j]|=f[i-1][j-1];
                if (t[j]=='*'&&s[i]==s[i-1]) f[i][j]|=f[i-1][j];
                if (t[j]=='*') f[i][j]|=f[i][j-1]|f[i][j-2];
            }
            puts(f[lens][lent]?"yes":"no");
        }
    }
  • 相关阅读:
    12.如何设置ulimit
    11.vim常用操作
    01Java jdk环境配置
    css
    Html
    day07 Class_field_method_反射
    JDBC
    Oracle day05 索引_数据去重
    Oracle day05 建表_约束
    Oracle day04 DML_事务_序列_视图_数据类型_DDL
  • 原文地址:https://www.cnblogs.com/Yuhuger/p/7413050.html
Copyright © 2011-2022 走看看