Baekjoon #2602

Baekjoon #2602

1개의 풀이 · C++

문제 원문 보기 ↗

SOLUTION INFO

C++ · main.cpp

main.cpp
#include<bits/stdc++.h>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    string S, bridge[2]; cin >> S >> bridge[0] >> bridge[1];
    int N = (int)bridge[0].size();
    int K = (int)S.size();

    // DP[2][N][K]
    vector<vector<vector<int>>> DP(2, vector<vector<int>>(N + 1, vector<int>(K + 1)));

    DP[0][0][0] = DP[1][0][0] = 1;
    for(int i = 1; i <= N; ++i) {
        for(int k = 0; k < 2; ++k) {
            char ch = bridge[k][i - 1];
            for(int l = 1; l <= K; ++l) {
                if(S[l - 1] != ch) continue;
                for(int j = 0; j < i; ++j) {
                    DP[k][i][l] += DP[1 - k][j][l - 1];
                }
            }
        }
    }

    int ans = 0;
    for(int i = 1; i <= N; ++i) {
        ans += DP[0][i][K] + DP[1][i][K];
    }
    cout << ans;
    
    return 0;
}

SOLUTION DESCRIPTION

풀이 설명

DP[2][N][K]: - DP[0][*][*]는 악마의 돌다리를 밟았을 경우, DP[1][*][*]는 천사의 돌다리를 밟았을 경우를 의미. - N번째 돌다리를 밟았고 현재 위치한 알파벳이 두루마리에 적힌 문자열 중에 하나라면 그 알파벳까지 밟은 경우의 수 - 주의할 점: 두루마리에 적힌 문자열에서 중복된 문자가 존재할 수 있음. DP[0][0][0] = DP[1][0][0] = 1 (기저 값) `DP[t][i][j] = ∑DP[1 - t][0...i-1][j - 1]` 시간복잡도: O(N^2K) Quiz. 여기서 어떻게하면 시간복잡도 O(N^2K)보다 빠르게 할 수 있을까요?