• 【Wannafly挑战赛10


    试题链接:https://www.nowcoder.com/acm/contest/72/B

    题目描述

        小H在击败怪兽后,被一个密码锁挡住了去路
        密码锁由N个转盘组成,编号为1~N,每个转盘有M个位置,每个位置上要么有一个小写字母,要么没有任何字符。一个密码能被转盘表示出,当且仅当指定每个转盘上面的某一个位置,然后将这些位置按照所属的转盘编号顺次连接(空位置直接忽略),可以得到这个密码
        小H并没有得到任何线索,因此只能猜,她一共猜了Q次,但并不知道自己猜的密码能否被表示出来,于是她向你求助

    输入描述:

    第1行,三个整数N,M,Q
    第2~N+1行,每行一个长度为M的字符串,依次表示每个转盘上的字符
    第N+2~N+Q+1行,每行一个长度不超过10000的字符串,表示小H猜的密码
    2≤N,Q≤300,2≤M≤27,同一个转盘上每种字符最多出现一次

    输出描述:

    输出Q行,每行都是YES或NO,依次表示小H猜的每个字符串能否被表示出

    思路:

    凡是最大值最小值、是否满足要求、有几种情况都可以用dp来解决
    令人悲痛的是比赛时没想起来用dp。。。
    dp[i][j] 代表前i个转盘转密码前j个字符是否满足要求(1满足0不满足),答案就是dp[n][len]的值。现在考虑状态转移,如果dp[i][j] = 1,并且第i+1个转盘能表示出第j+1个字符,那么dp[i+1][j+1]也等于1,如果dp[i][j] = 0,那么无论如何dp[i+1][j+1] = 0,表示出来即为dp[i+1][j+1] |= dp[i][j]。同理,第i+1个转盘上有'#'时dp[i+1][j] |= dp[i][j]。
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int flag[305][305], dp[305][305];
     4 char s[30], s1[10005];
     5 int main()
     6 {
     7     int n, m, q, i, j;
     8     scanf("%d%d%d", &n, &m, &q);
     9     for(i = 1; i <= n; i++)
    10     {
    11         scanf("%s", s);
    12         for(j = 0; j < m; j++)
    13         {
    14             if(s[j] == '#') flag[i][26] = 1;
    15             else flag[i][s[j]-'a'] = 1;
    16         }
    17     }
    18     while(q--)
    19     {
    20 
    21         scanf("%s", s1+1);
    22         int len = strlen(s1+1);
    23         if(len > n)
    24         {
    25             puts("NO");
    26             continue;
    27         }
    28         memset(dp, 0, sizeof dp);
    29         dp[0][0] = 1;
    30         for(i = 0; i <= n; i++)
    31             for(j = 0; j <= len; j++)
    32             {
    33                 if(flag[i+1][s1[j+1]-'a']) dp[i+1][j+1] |= dp[i][j];
    34                 if(flag[i+1][26]) dp[i+1][j] |= dp[i][j];
    35             }
    36         if(dp[n][len]) puts("YES");
    37         else puts("NO");
    38     }
    39     return 0;
    40 }
  • 相关阅读:
    javascript中的this指向
    面向对象和面向过程、对象、类、实例
    javascript
    实例011:养兔子
    day13匿名函数
    实例010:给人看的时间
    python基础学习day12 生成器与推导式
    实例009:暂停一秒输出
    python基础学习day11函数的进阶
    第一部分:趣味算法入门;第八题:冒泡排序(并与选择排序对比)
  • 原文地址:https://www.cnblogs.com/lesroad/p/8467296.html
Copyright © 2020-2023  润新知