본문 바로가기
728x90

다이나믹 프로그래밍18

[Python] 백준 15998 1,2,3 더하기 3 https://www.acmicpc.net/problem/15988 15988번: 1, 2, 3 더하기 3 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net 문제해결 DP를 공부했으면 굉장히 쉽게 풀었을 수 있다. n을 숫자 1,2,3의 합으로 나타내는 방법의 수를 dp[n]이라고 하면, dp[n] = dp[n-1] + dp[n-2] + dp[n-3] 왜냐하면 n-1를 숫자 1,2,3의 합으로 나타낸 후 숫자 1을 더한 것의 개수는 dp[n-1]과 동일 n-2를 숫자 1,2,3의 합으로 나타낸 후 숫자 2를 더한 것의 개수는 dp[n-2]과 동일하며 n-3을 숫자 1,2,3의 합으로 나타낸 후 숫자 3.. 2022. 12. 25.
[Python] 백준 1699 제곱수의 합 https://www.acmicpc.net/problem/1699 1699번: 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다 www.acmicpc.net 문제해결 dp를 이용해야겠다라는 생각이 든다! - y를 제곱수의 합으로 표현할 때 최소개수를 dp[y]라고 하고 x를 y보다 작은 제곱수라고 가정하면 dp[y] = min(dp[y], dp[y-x] + 1) 만약 어떤 수 y가 제곱수이면 dp[y] = 1 인 것이 명백하므로 먼저 제곱수는 dp[y] = 1을 고정시키자. for 문을 쓰면 될 것 같은데? co.. 2022. 12. 25.
[Python] 백준 2225 합분해 https://www.acmicpc.net/problem/2225 2225번: 합분해 첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 문제 해결 - 숫자 n을 k개의 숫자로 나타내는 개수를 어떻게 구할 것인가? - 숫자에 0을 포함한다는 것은 것을 주의하자. - 잘 모르겠으면 숫자 1 부터 귀납적으로 한 번 해보자! - 1을 1개 숫자로 1 = 1 (1개), 1을 2개 숫자로 1= 1 + 0 = 0 + 1 (2개) 1 = 1 + 0 + 0 = 0 + 1 + 0 = 0 + 0 + 1 (3개)... - 2=2 (1개) 2= 2+0 = 1+1 = 0 +2 (3개) ... 표로 정리를 하면 k \ n n = 1 n=2 n=3 k = 1 (모든 값이1) 1 1 1.. 2022. 12. 24.
[Python] 백준 2193 이친수 https://www.acmicpc.net/problem/2193 2193번: 이친수 0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않 www.acmicpc.net 문제 해결 - 다이나믹 프로그래밍(dp)인 것은 쉽게 눈치 챌 수 있다. - n자리 이친수 개수를 dp[n]으로 놓을 때 dp[n] = dp[n-1] + dp[n-2]임을 알아야 한다. 그림판으로 그리면 dp[n]=dp[n-1] + dp[n-2]임을 알 수 있다. CODE import sys input= sys.stdin.readline n = int(input()) dp = [0 fo.. 2022. 12. 22.
728x90