동적계획법을 쓸수있게하는 설계..WILDCARD 질문드립니다

  • kws4679
    kws4679

    안녕하세요

    WILDCARD 문제http://algospot.com/judge/problem/read/WILDCARD

    를 푸는 중에 우선 제가 먼저 풀어보려고하는데

    아무리 생각해도 동적계획법으로 변형할수없을것같습니다

    그래서 질문드리고싶은것이

    1. 이렇게 구현한 경우에는 어떻게 동적계획법으로 전환해야하나요?

    패턴에 주어진 *를 타겟 글자 수를 넘지않는한 ?로 바꿉니다
    예를들어 *p*, help 는
    p
    p?
    p??
    p???
    ?p
    ?p?
    ?p??
    ??p
    ??p?
    쭉쭉..
    그리고 매칭합니다.

    이렇게 만들경우 시간초과가 나와서 캐싱을 해야할것같은데

    좋은 방법이 있나요?

    2. 동적계획법 문제에서 구현방식에 따라 동적계획법을 쓰지 못하는
    경우도 있는건가요? 저처럼 구현하면 왠지 중복되는 내용이 없을거같은데...

    혹시몰라서 소스코드도 첨부해봅니다!~

    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    bool match(string m, string t){
        if(m.size() != t.size()) return false;
        for(int i = 0; i < m.size(); i++) if(m[i] != '?' && m[i] != t[i]) return false;
        return true;
    }
    
    bool wildcard(string w, string t, string made){
        if(!w.size() || (t.size() < made.size())){
            if(made.size() != t.size()) return false;
            if(match(made, t)) return true;
            else return false;
        }
        cout << made << endl;
        int i = 0;
        while(i < w.size() && w[i] != '*') i++;
        if(i==w.size()) return wildcard(string(""), t, made+w);
        for(int j = 0; j < t.size(); j++){
            string m = string(w.begin(), w.begin()+i);
            for(int k = 0; k < j; k++) m += "?";
            if(wildcard(string(w.begin()+i+1,w.end()), t, made+m)) return true;
        }
        return false;
    }
    
    int main(){
        int c;
        scanf("%d", &c);
        while(c--){
            string w;
            cin >> w;
            int n;
            scanf("%d", &n);
            vector<string> in;
            while(n--){
                string i;
                cin >> i;
                in.push_back(i);
            }
            for(int k = 0; k < in.size(); k++) if(wildcard(w, in[k], string(""))) cout << in[k] << endl;
        }
        return 0;
    }
    


    11년 전
3개의 댓글이 있습니다.
  • KimJJ
    KimJJ

    문자열 더하는 연산이 비용이 꽤 많이 들어갑니다.


    11년 전 link
  • JongMan
    JongMan

    글고 이렇게 하면 어떻게 동적계획법이 될지 저도 감이 안오는군요. 물론 어떻게 재귀 호출 함수를 짜느냐에 따라 중복이 있을 수도, 없을 수도 있습니다.


    11년 전 link
  • kws4679
    kws4679

    답변 감사합니다 ^^ 책에 조금 뒤에 내용을 보니까 동적계획법을 쓸수있는 조건에 대해서 자세히 나와있더군요 그런것을 만족시키지 못하는것 같습니다!!


    11년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.