zoukankan      html  css  js  c++  java
  • wannafly 挑战赛10 小H和密码

    题意:中文题就不解释了

    题解: dp[i][j]表示前i 个轮盘 和一个字符串前j 个字符的匹配情况 ,具体的状态转移解释见代码

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <string>
    using namespace std;
    int n,m,q;
    int vis[350][1005];
    int dp[350][1005];
    int main()
    {
    
        cin>>n>>m>>q;
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)// lunpan
        {
            string s;
            cin>>s;
            for(int j=0;j<m;j++)// meiyi wei
            {
                if(s[j]=='#') vis[i][30]=1;// '#'
                else vis[i][s[j]-'a']=1;
            }
        }
        while(q--)
        {
            char s[20000];
            scanf("%s",s+1);
            memset(dp,0,sizeof(dp));
            int len=strlen(s+1);
            if(len > n)
            {
                cout<<"NO"<<endl;
                continue;
            }
    
            dp[0][0]=1;// 初始情况,这个地方好好琢磨一下 写的时候还是出了很多细节问题
            for(int i=0;i <= n;i++) // lunpan
            {
                for(int j=0;j<=len;j++)
                {
                    if(dp[i][j] == 0) continue; // 如果当前位置无法匹配 那就不需要进行之后的匹配了
                    if(vis[i+1][s[j+1]-'a'] == 1) dp[i+1][j+1] = 1; // i+1 和j+1位置 的字符能够匹配且dp[i][j]==1  那么能够匹配
                    if(vis[i+1][30] == 1) dp[i+1][j] = 1; // 如果i+1有‘#’字符且dp[i][j]==1,那么dp[i+1][j]的值也就是1了
                }
            }
            if(dp[n][len] == 1) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    C语言保留字
    N的阶乘末尾有多少个零?
    控制台初级玩法
    数据结构笔记#二分法查找
    数据结构应用实例#栈&单链表#简易计算器
    数据结构应用实例#栈#迷宫寻路
    数据结构笔记#栈
    #2028 Lowest Common Multiple Plus
    数据结构笔记#单链表
    #2018 母牛的故事
  • 原文地址:https://www.cnblogs.com/z1141000271/p/8474612.html
Copyright © 2011-2022 走看看