본문 바로가기

DP6

[JAVA] 2xn 타일링 2 ::: 다이나믹 프로그래밍 보호되어 있는 글 입니다. 2022. 7. 19.
[JAVA] 파도반 수열 ::: 수학, 다이나믹 프로그래밍 [ 문제 ] https://www.acmicpc.net/problem/9461 아래 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 길이를 k라 했을 때, 그 변에 길이가 k인 정삼각형을 추가한다. 파도반 수열 P(N)은 나선에 있는 정삼각형의 변의 길이이다. P(1)부터 P(10)까지 첫 10개 숫자는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9이다. N이 주어졌을 때, P(N)을 구하는 프로그램을 작성하시오. [ 제출코드 ] [ 풀이 ] dp[i] = dp[i-2] + dp[i-3] 규칙으로 저장한다. N = 100일때 int 범위를 벗어나므로 long으로 설정하기! 2022. 7. 14.
[C++] 2xn 타일링 ::: DP 보호되어 있는 글 입니다. 2021. 6. 18.
[C++] 1463번 1로 만들기 [문제] 1463번 문제보기 [제출코드] [풀이] 1 2 -> 1 3 -> 1 4 -> 3 -> 1 5 -> 4 -> 3 -> 1 6 -> 2 -> 1 ... 노란색으로 칠해진 부분은 이미 앞에서 연산된 부분이다. 했던 계산을 또 하는 것은 비효율적이므로, 연산을 사용하는 최솟값을 배열에 저장한다. [이야기] 항상 vector만 사용했기에 이번에는 동적배열을 사용해보고 싶었다. [참고] 함수로_배열_전달 2021. 2. 24.
[C++] 10870번 피보나치 수 5 [문제] 10870번 문제보기 [제출코드] [이야기] 이 문제는 다이나믹 프로그래밍을 안다면 너무 쉽게 풀 수 있는 문제다. 2021. 2. 24.
[C++] 1003번 피보나치 함수 [문제] 1003번 문제보기 [제출코드] [풀이] f(0) = 0 f(1) = 1 f(2) = f(1) + f(0) = 1 + 0 f(3) = f(2) + f(1) = { f(1) + f(0) } + f(1) = 1 + 0 + 1 ... 재귀로 풀면 위처럼 이미 계산한걸 또다시 계산해야하므로 비효율적이다. 하지만 DP로 풀게 되면, f(0)과 f(1)의 결과만 배열에 저장해놓고 2이상의 n은 앞의 2개의 결과를 더해주기만 하면 되므로 훨씬 시간이 단축된다. [이야기] 알고리즘을 배우기 전 DP를 몰라서 시간초과로 틀렸던 문제다. 그때는 다이나믹을 생각하지 않고 재귀로 해서 틀렸었다. 2021. 2. 22.