문제 -> https://www.acmicpc.net/problem/11057
이번 문제는 나름 참신하게 문제를 푼 것 같다?..
어떤 누군가가 이렇게 풀이를 한 사람이 있을수도 있겠지만..
========================================
보통 3중 for문으로 일일이 dp값을 다 더하는 반면에,
나는 연산량을 줄이려고 다른 점화식을 생각해봤다..
dp[i][j] : i번째 자릿수에서 숫자 j가 만들어낼 수 있는 경우의 수
여기서 만들어 낼 수 있는 경우의 수라고 함은
숫자 j가 i+1번째 자릿수의 가능한 경우의수를 의미한다.
dp[i][10] : i+1번째 자릿수의 모든 경우의 수
i-1 번째 자릿수의 가능한 경우의 수는
i번째의 숫자 0이 만들 수 있는 경우의 수와 같으므로
dp[i][0] = dp[i-1][10]으로 정의하였다.
(단, j > 0) dp[i][j] = dp[i][j-1] - dp[i - 1][j - 1] 과 같다.
dp[i][0] = dp[i-1][10] 이고, dp[i][1] = dp[i][0] - dp[i-1][0]과 같기 때문.
< N = 0일때 >
<N = 1일때>
<N = 2일때>
나의 코드상에
dp[i][j] = (dp[i][j - 1] - dp[i - 1][j - 1] + 10007) % 10007;
이렇게 적혀있는 이유는,
만약 dp[i][j-1]이 dp[i-1][j-1] 보다 크면서 10007을 넘어버리면
나머지 연산 때문에 dp[i-1][j-1]보다 작아지게 된다.
그래서 계산에 영향을 주지 않으며 음수값을 없애기 위해
위와 같이 취하였다.
'BOJ' 카테고리의 다른 글
[BOJ][DP] 11055. 가장 큰 증가 부분 수열 (0) | 2018.01.21 |
---|---|
[BOJ][DP] 1699. 제곱수의 합 (0) | 2018.01.20 |
[BOJ][DP] 11053. 가장 긴 증가하는 부분 수열 (0) | 2018.01.18 |
[BOJ][DP] 2293. 동전 1 (0) | 2018.01.17 |
[BOJ][DP] 9465. 스티커 (0) | 2018.01.16 |