다이나믹프로그래밍 3

[누적합, DP] BOJ 21757 나누기

https://www.acmicpc.net/problem/21757 21757번: 나누기 $N$개의 정수 수열 $A_1, A_2, \dots , A_N$이 주어진다. 수열을 각각이 연속된 네 부분으로 나누려고 한다. 단, 각 부분은 최소 하나의 수를 포함해야 한다. 또, 각 부분의 합은 모두 같아야 한다. 즉, 어 www.acmicpc.net 문제 해결 알고리즘 수열의 누적합 배열을 만들어 준 후에 수열의 총합을 구하고, 총합이 0인 경우와 아닌 경우 두 가지로 나눠서 풀어줘야한다. 0인 경우는 마지막 0빼고 나머지 0의 개수에서 3개를 뽑는 조합으로 개수를 구해주면된다. 0이 아닌 경우는 다이나믹 프로그래밍을 이용해서 풀어줄 수 있는데 총합에서 4를 나누면 공차가 나오고 그 공차대로 늘어나는 길이 4의..

[DP] BOJ 2011 암호코드 (C++)

https://www.acmicpc.net/problem/2011 2011번: 암호코드 나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다. www.acmicpc.net 문제 해결 알고리즘 0만 없으면 참 간단한 문제인데.. 0 때문에 어려웠다. 구현이 빡셌던 문제 우선 글자 수별로 구분해줘야하는데 글자 수가 1일 때, 2일 때, 3이상일 때로 구분해준다 글자 수가 1일 때, 숫자가 0이면 0을 출력해주고, 0이 아니면 1을 배열 값에 넣어준다. 글자 수가 2일 때, if(num == 10 || num == 20) v[1] = 1; else if((11

[DP] BOJ 9465 스티커

https://www.acmicpc.net/problem/9465 9465번: 스티커 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 www.acmicpc.net 문제 해결 알고리즘 $$ \begin{array} ddp[0][i] & = & arr[0][i] + maximum(dp[1][i-1], \; dp[1][i-2]) \\ dp[1][i] & = & arr[1][i] + maximum(dp[0][i-1], \; dp[0][i-2]) \end{array} $$ 위의 식대로 다이나믹 프로그래밍을 진행해주는 문제. 이 때 $i$는 2보다 크거나 ..