wannafly 挑战赛10 小H和密码

Posted 不搞事情和咸鱼有什么区别

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于wannafly 挑战赛10 小H和密码的主要内容,如果未能解决你的问题,请参考以下文章

Wannafly挑战赛25 B 面积并 数学

Wannafly挑战赛19

Wannafly挑战赛18 B - 随机数

Wannafly挑战赛15

Wannafly挑战赛14

Wannafly挑战赛4. B