zoukankan      html  css  js  c++  java
  • BZOJ3297: [USACO2011 Open]forgot DP+字符串

    Description

    发生了这么多,贝茜已经忘记了她cowtube密码。然而,她记得一些有用的信息。首先,她记得她的密码(记为变
    量P)长度为L(1 <= L<=1,000)字符串,并可以被分成 一个或多个词(不一定是唯一的),词来自于字典中NW(
    1<=NW<=1,000)个独特的词。 一个词W_i,被定义为一个长度1..20的小写字母序列('a'..'z')。她还记得她密码
    中某些字母的位置。
    请看下面的例子。
    贝西知道她的密码看起来像"a??l?ban???????"('?'代表一个字母,她不记得), 
    她的字典里有下面的词: 
    apple 
    cow 
    farmer 
    banana 
    bananas 
    pies 
    贝西有两个可能的密码是的“applebananapies”和“applebananascow”。 
    给你字典,贝西记得的字母,请找到她的密码。如果有一个以上的密码是可能的,找到字典序最前的。 

    Input

    *第1行:两个空格分隔的整数:L和NW 
    *第2行:一个字符串,长度为L:P 
    *第3..N+2W行:第I+2行包含在字典中的第i个字:W_i

    Output

    *第1行:密码

    Sample Input

    15 6
    a??l?ban???????
    apple
    cow
    farmer
    banana
    bananas
    pies

    Sample Output

    applebananapies

    Solution

    一开始没啥想法就打了一个搜索,复杂度$O$(期望能过),结果T的很稳

    想了想其他做法发现其实可以直接$dp$维护字典序最小

    $string$都不会用了...QAQ

    #include <bits/stdc++.h>
    
    using namespace std ;
    
    int L , n ;
    char s[ 1010 ] , ans[ 1010 ] ;
    string a[ 1010 ] ;
    string f[ 1010 ] ;
    int len[ 1010 ] ;
    
    bool check( int x , int t ) {
        for( int i = 0 ; i < len[ t ] ; i ++ ) {
            if( a[ t ][ i ] != s[ x + i ] && s[ x + i ] != '?' ) return 0 ; 
        }
        return 1 ;
    }
    
    int main() {
        scanf( "%d%d" , &L , &n ) ;
        scanf( "%s" , s + 1 ) ;
        for( int i = 1 ; i <= n ; i ++ ) {
            cin >> a[ i ] ;
            len[ i ] = a[ i ].length() ; 
        }
        for( int i = 1 ; i <= L ; i ++ ) {
            for( int j = 1 ; j <= n ; j ++ ) {
                int t = i - len[ j ] ;
                if( t < 0 ) continue ;
                if( t && f[ t ] == "" ) continue ;
                if( check( t + 1 , j ) ) {
                    if( f[ i ] == "" || f[ i ] > f[ t ] + a[ j ] ) 
                        f[ i ] = f[ t ] + a[ j ] ;
                }
            }
        }
        cout << f[ L ] << endl ;
        return 0 ;
    }
  • 相关阅读:
    Binary Search Tree Iterator 解答
    Invert Binary Tree 解答
    Min Stack 解答
    Trapping Raining Water 解答
    Candy 解答
    Jump Game II 解答
    Implement Hash Map Using Primitive Types
    Gas Station 解答
    Bucket Sort
    HashMap 专题
  • 原文地址:https://www.cnblogs.com/henry-1202/p/9774331.html
Copyright © 2011-2022 走看看