• 常州模拟赛d1t5 遗忘口令


    就像每个人都会遇到的问题一样,贝西忘了在 cowtube 上的口令。不过,她还记着一些关于口令

    的信息。首先,她确定口令由小写字母组成,长度为 L。其次,这个密码是由几个单词组合而成

    的。贝西一共认识 N 个单词,每个单词长度都在 1 到 20 之间,由小写字母组成。最后,贝西还

    记得口令上一些位置的字母,她会尽量提供记住的部分,如果有些位置上的字母不记得了,就用?

    代替。

    给定贝西记得的口令片段和她认识的单词列表,请恢复出她的口令,如果完全符合条件的口令不

    止一个,输出按照字典序排在最前面的那个。

    输入输出格式

    输入格式:

    第一行:两个用空格分开的整数:L 和 N,1≤L≤1000,1≤N≤1000

    第二行:一个 L 长的字符串,代表口令 P

    第三行到 N+2 行:第 i+2 有一个字符串 W_i,表示贝西认识的第 i 个单词 W_i

    输出格式:

    第一行:一个字符串,表示符合条件的,在字典序下最靠前的口令

    输入输出样例

    输入样例#1:
    15 6
    a??l?ban???????
    apple
    cow
    farmer
    banana
    bananas
    pies
    输出样例#1:
    applebananapies
    样例解释
    (有两个可行的组合,一个是 applebananapies,还有一个是 applebananascow,前者较靠前)

    说明

    对于 30% 的数据,有 1 ≤ L,N≤ 30。

    对于 100% 的数据,有 1 ≤ L,N≤ 1, 000。

    分析:万万没想到这道题还能用dp做,大开眼界啊,但是时间紧直接打了个暴力还有20分?

          其实这道题很像0-1背包啊,每个口令的容积就是它的长度,价值就是它的字典序的贡献,只不过多了几个限制,最关键的是字符串中间一定不能有空串,也就是说不能拼接成apple  banana这样的,所以要加一个特判,dp就很好想啦,设f[i]为前i个字符的组合,那么f[i] = min{f[i-j.size()] + j}.

    这种字符串的下标处理真的是超级超级烦人.

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<cmath>
    #include<map>
    #include<string>
    
    using namespace std;
    
    int l, n;
    string p,w[1010],f[1010];
    
    bool check(int x, int y)
    {
        for (int i = x - w[y].size() + 1, j = 0; i <= x; i++, j++)
            if (p[i] != '?' && p[i] != w[y][j])
                return false;
        return true;
    }
    
    int main()
    {
        scanf("%d%d", &l, &n);
        cin >> p;
        for (int i = 1; i <= n; i++)
            cin >> w[i];
        for (int i = 1; i <= l; i++)
            for (int j = 1; j <= n; j++)
            {
                int sizee = w[j].size();
                if (sizee > i || (f[i - sizee] == "" && i - sizee != 0))
                    continue;
                if (check(i - 1, j))
                {
                    if (f[i] == "")
                        f[i] = f[i - sizee] + w[j];
                    else
                        f[i] = min(f[i], f[i - sizee] + w[j]);
                }
            }
        cout << f[l] << endl;
    
        return 0;
    }
  • 相关阅读:
    官方示例之地球模块十:拔高GeoPolygon
    全景虚拟漫游技术实现(three.js vs ThingJS) Javascript 3D开发 前端 物联网 webgl 三维建模 3D模型 虚拟 全景
    一个3D城市地图应用工具,等你获取 3D 全景 可视化
    H5动画优化之路
    CSS3实现气泡效果
    清除浮动方法总结
    静态页面参数传递&回调函数写法&快速排序的实现方法
    使用SeaJS实现模块化JavaScript开发(新)
    《无懈可击的Web设计》_灵活的文字
    深入探究JavaScript中的比较问题
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7412336.html
Copyright © 2020-2023  润新知