le_effort   4년 전

수열의 각 자리는 0 또는 1입니다. 이를 이용하면
1) 마지막 비트가 0인 경우 a) 이전 비트가 0인 경우 : 인접한 비트 수 변화 없음 b) 이전 비트가 1인 경우 : 인접한 비트 수 변화 없음
2) 마지막 비트가 1인 경우 a) 이전 비트가 0인 경우 : 인접한 비트 수 변화 없음 b) 이전 비트가 1인 경우 : 인접한 비트 수 변화 있음

* dp 정의
dp[n][k][m] : 길이가 n이고 인접한 비트 수가 k이고 마지막 비트가 m인 경우의 수
* dp 점화식
dp[n][k][0] = dp[n-1][k][0] + dp[n-1][k][1] 

dp[n][k][1] = dp[n-1][k][0] + dp[n-1][k-1][1]


어떤 블로그에서 퍼온 글 인데요

글은 이해 되는데 점화식이 이해가 안됩니다.


마지막 자리가 0 일 때 이전거랑 비교가 없다는 건데

왜 n-1 k 0 이랑 n-1 k 1 을 더해주는 건가요?

예를들어서

0으로 끝나는것의 1의 개수 2개

1으로 끝나는 것의 1의 개수 2개 라고 치면

둘을 더하면 4개가 되는거 아닌가요??

sait2000   4년 전

질문은 무슨 말인지 모르겠고요...

저 점화식은 말 그대로 길이가 n이고 인접한 비트 수가 k이고 마지막 비트가 m인 수열의 개수를 세는 겁니다.

예를 들어 길이가 3이고 인접한 비트 수가 0이고 마지막 비트가 0인 수열은 000, 100, 010 이렇게 3개 있으니까 dp[3][0][0] = 3이 되겠죠.

이때 저 수열을 마지막에서 2번째 비트가 뭔지에 따라 나누는 겁니다.

0: 000, 100

1: 010

이러고 나서 각각에서 마지막 비트를 지우면

0: 00, 10

1: 01

이렇게 되겠죠. 그러면 0 그룹에 있는 수열들은 전부 다 길이가 2이고 인접한 비트 수가 0이고 마지막 비트가 0임을 알 수 있습니다.

또 잘 생각해보면 길이가 2이고 인접한 비트 수가 0이고 마지막 비트가 0인 임의의 수열에 0을 붙이면 길이가 3이고 인접한 비트 수가 0이고 마지막 비트가 0인 수열이 됩니다.

즉, 길이가 3이고 인접한 비트 수가 0이고 마지막 비트가 0인 수열 중에서 마지막에서 2번째 비트가 0인 수열의 개수는 길이가 2이고 인접한 비트 수가 0이고 마지막 비트가 0인 수열의 가수와 같습니다. 즉, dp[2][0][0]이 됩니다. 1 그룹, 마지막 비트가 1인 수열의 개수도 비슷하게 세면 됩니다.

대충 이런 느낌이네요...

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