码迷,mamicode.com
首页 > 其他好文 > 详细

wannafly 挑战赛10 小H和密码

时间:2018-02-26 19:40:16      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:name   set   --   using   密码   cout   names   题解   mem   

题意:中文题就解释了

题解: 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;
}

 

wannafly 挑战赛10 小H和密码

标签:name   set   --   using   密码   cout   names   题解   mem   

原文地址:https://www.cnblogs.com/z1141000271/p/8474612.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!