chabt   4년 전

아래가 솔직히 잘 이해가 안되요. 좀 쉽게 이해할 수 있는 방법이 있을까요 ?

1차원DP에서는 시간초과가 나기 때문에 2차원DP를 써야 한다고 되어 있는데요.

D[i][1] = D[i-1][1] + D[i-3][0]  --> 이 부분 잘 이해가 안가요 ?  어떻게 이해해야 할까요 ?

D[1][0] = 2;
D[2][0] = 7;
D[2][1] = 1;

for(int i=3; i<=N; i++) {
D[i][1] = (D[i-1][1] + D[i-3][0]) % MOD;
D[i][0] = (D[i-2][0]*3 + D[i-1][0]*2 + D[i][1]*2) % MOD;
}

dhtmdgus2134   3년 전

안녕하세요.

1년전에 질문하신거면 지금쯤 답을 찾으셨으리라 생각합니다.

저도 질문자님처럼 그 부분을 몰라서 직접 손으로 과정을 따라가면서 생각해보니 이해가 됫네요 ㅎㅎ

혹시 질문자님이나 저처럼 고민하신분들의 소중한 시간을 위해 최대한 이해가능하게 설명 남기겠습니다.

점화식의 함수를 tiling이라 치환하여 설명하겠습니다.

tiling(5) 를 예시로 보이겠습와니다.

tiling(5) = 2 * tiling(5-1) + 3 * tiling(5-2) + 2(tiling(5-3) + tiling(5-5)) 

                    2 * tiling(4) + 3 tiling(3) + 2 ( tiling(2) +tiling (1) + tiling (0) )

이렇게 됩니다.

여기서  표로 보게 되면 이런 모양이 됩니다.

DP             0               1                 2               3                             4                                      5

DP[][0]      1                2                7               22                           71

DP[][1]                                                           1                      1      +     2                        1      +     2       +     7
                                                                tiling(0)            tiling(0) + tiling(1)             tiling(0) + tiling(1) + tiling(2)         tiling(2) == DP[x-3][0]

이처럼 2차원 배열에서는 2 * DP[x-2][0]와 3 * DP[x-1][0]을 제외한 특수한 경우의 수를 보관해야합니다.

그런데 DP[x-1][1]에서는 DP[x-3][0] 이후의 케이스들만 담고 있기 때문에 DP[x-3][0]의 케이스를 더해야 합니다.

제가 설명을 잘못해서 최대한 이해될 수 있는 요소들을 추가 했는데 이해 안되면 tiling(6)의 케이스를 직접 손으로 풀어보시길 바랍니다.

댓글을 작성하려면 로그인해야 합니다.