동적계획법을 쓸수있게하는 설계..WILDCARD 질문드립니다 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 문자열 더하는 연산이 비용이 꽤 많이 들어갑니다. 11년 전 link JongMan 글고 이렇게 하면 어떻게 동적계획법이 될지 저도 감이 안오는군요. 물론 어떻게 재귀 호출 함수를 짜느냐에 따라 중복이 있을 수도, 없을 수도 있습니다. 11년 전 link kws4679 답변 감사합니다 ^^ 책에 조금 뒤에 내용을 보니까 동적계획법을 쓸수있는 조건에 대해서 자세히 나와있더군요 그런것을 만족시키지 못하는것 같습니다!! 11년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
kws4679
안녕하세요
WILDCARD 문제http://algospot.com/judge/problem/read/WILDCARD
를 푸는 중에 우선 제가 먼저 풀어보려고하는데
아무리 생각해도 동적계획법으로 변형할수없을것같습니다
그래서 질문드리고싶은것이
1. 이렇게 구현한 경우에는 어떻게 동적계획법으로 전환해야하나요?
패턴에 주어진 *를 타겟 글자 수를 넘지않는한 ?로 바꿉니다
예를들어 *p*, help 는
p
p?
p??
p???
?p
?p?
?p??
??p
??p?
쭉쭉..
그리고 매칭합니다.
이렇게 만들경우 시간초과가 나와서 캐싱을 해야할것같은데
좋은 방법이 있나요?
2. 동적계획법 문제에서 구현방식에 따라 동적계획법을 쓰지 못하는
경우도 있는건가요? 저처럼 구현하면 왠지 중복되는 내용이 없을거같은데...
혹시몰라서 소스코드도 첨부해봅니다!~
11년 전