https://www.acmicpc.net/problem/2156
2156๋ฒ: ํฌ๋์ฃผ ์์
ํจ์ฃผ๋ ํฌ๋์ฃผ ์์ํ์ ๊ฐ๋ค. ๊ทธ ๊ณณ์ ๊ฐ๋๋, ํ ์ด๋ธ ์์ ๋ค์ํ ํฌ๋์ฃผ๊ฐ ๋ค์ด์๋ ํฌ๋์ฃผ ์์ด ์ผ๋ ฌ๋ก ๋์ฌ ์์๋ค. ํจ์ฃผ๋ ํฌ๋์ฃผ ์์์ ํ๋ ค๊ณ ํ๋๋ฐ, ์ฌ๊ธฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ง ๊ท
www.acmicpc.net
์๊ณ ๋ฆฌ์ฆ [์ ๊ทผ ๋ฐฉ๋ฒ]
https://linerate.tistory.com/31
[2579๋ฒ] ๊ณ๋จ ์ค๋ฅด๊ธฐ JAVAโ
www.acmicpc.net/problem/2579 ๊ณผ ๊ฐ์ด ๊ฐ๊ฐ์ ๊ณ๋จ์๋ ์ผ์ ํ ์ ์๊ฐ ์ฐ์ฌ ์๋๋ฐ ๊ณ๋จ์ ๋ฐ์ผ๋ฉด ๊ทธ ๊ณ๋จ์ ์ฐ์ฌ ์๋ ์ " data-og-host="www.acmicpc.net" data-og-source-url="https://www.acmicpc.net/proble..
linerate.tistory.com
์ ๋ฌธ์ ์ ๊ฑฐ์ ์ ์ฌํ์ง๋ง ๊ณ๋จ ์ค๋ฅด๊ธฐ ๋ฌธ์ ๋ '๋ง์ง๋ง ๊ณ๋จ์ ๋ฐ๋์ ๋ฐ์์ผ ํ๋ค'๋ ์กฐ๊ฑด์ด ๋ถ์ด ์๊ธฐ ๋๋ฌธ์ ํฌ๋์ฃผ ์์ ๋ฌธ์ ์๋ ์ฐจ์ด์ ์ด ์๋ค.
'๋ฐ๋์ ๋ง์ง๋ง ๊ณ๋จ์ ๋ฐ๋๋ค'๋ ์๋ฏธ๋ ๊ฒฐ๊ตญ ๋ง์ง๋ง ๊ณ๋จ์ ๋ํ ๊ฒฝ์ฐ์ ์๋ค์ ๋์ ํฉ ์ค ์ต๋๊ฐ์ด๋ค. ์ฆ, ์ด์ ๊ณ๋จ์ด ๋ง์ง๋ง ๊ณ๋จ๋ณด๋ค ๋์ ํฉ์ด ์ปธ๋ค๊ณ ํ๋๋ผ๋ ๋ง์ง๋ง ๊ณ๋จ์ ๋ฐ์ ์ ์๋ค๋ฉด ๊ทธ ๊ฐ์ ์ ์กฐ๊ฑด์ ์๋ฐฐ๋์ด ์ ๋ต์ด ์๋๋ค. ๋ฐ๋ฉด์ ํฌ๋์ฃผ ์์์ ๊ทธ๋ฐ ์กฐ๊ฑด์ด ์๋ค. ์ฆ, ๋ง์ง๋ง ์์ธ์์ด ์ ํ ๋ ๋๊ฐ ์ต๋ ๋์ ํฉ์ผ์๋, ๋๋ ๊ทธ ์ด์ ์์ธ์๊น์ง ์ ํ์ด ์ต๋ ๋์ ํฉ์ผ ์๋ ์๋ค.
์ฝ๊ฒ ์๊ฐํ์๋ฉด,
10,25,30,1 ์ด ์ฐจ๋ก๋๋ก ์๊ณ , 2๊ฐ๋ฅผ ์ด๊ณผํ์ฌ ์ฐ์์ผ๋ก ๋ฝ์ ์ ์์ ๋ ๋ง์ง๋ง ์ซ์๋ฅผ ๋ฐ๋์ ๊ฑฐ์ณ์ผ ํ๋ ๊ฒฝ์ฐ์ ๊ทธ๋ฐ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ ๋์ ํฉ์ ์ต๋๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ๋ฌ๋ผ์ง๋ค.
<๋ง์ง๋ง ์ซ์(1)๋ฅผ ๋ฐ๋์ ๊ฑฐ์ณ์ผ ํ๋ ๊ฒฝ์ฐ>
10,30,1 -> ๋์ ํฉ: 41
<์ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ>
25,30 -> ๋์ ํฉ:55
[Top-Down]
๋จผ์ , N๋ฒ์งธ ๊ฐ์ ์ ํํ ๋ ๋จ์ํ (N-1)๋ฒ์งธ ๊ฐ์ ์ ํํ ๊ฒฝ์ฐ N-1 ์์๋ ๋ N-1์ -1, ์ฆ (N-2), ์ด๋ฐ์์ผ๋ก ๋ชจ๋ ๊ฐ์ ์ ํํด๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ฆ, ์ฐ๋ฆฌ๋ ํธ์ถํด ์ค ๋ ๋น์ฐ์์ ์ธ ๊ฐ์ ํ์ํด๋๊ฐ๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ N๋ฒ์งธ ๊ฐ์ ๋ํ์ฌ (N-2)๋ฒ์งธ ๊ฐ๊ณผ (N-3)๋ฒ์งธ ๊ฐ์ ํ์ํด์ค ํ์๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ N-3์ ๊ฒฝ์ฐ ํด๋น ์ฌ๊ทํธ์ถ์ด ๋๋ฌ์ ๊ฒฝ์ฐ ๊ทธ์๋ํ ๊ฐ์ N-1๊ฐ์ ๋ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ํ์ด๋๊ฐ์ผ ํ๋ค.
static int recur(int N) {
if(dp[N] == null) {
dp[N] = Math.max(recur(N - 2), recur(N - 3) + arr[N - 1]) + arr[N];
}
return dp[N];
}
๋ฉ๋ชจ์ด์ ์ด์ ์ ํ๋ ๋ฐฐ์ด์ด dp๋ผ๊ณ ํ ๋ ํด๋น N์ด ํ์ํ์ง ์์๋ ์ธ๋ฑ์ค์๋ค๋ฉด N-2๋ฅผ ์ฌ๊ท ํธ์ถ ํ ๊ฒ๊ณผ(๋น์ฐ์), N-3์ ์ฌ๊ทํธ์ถ ํ ๊ฐ์ N-1๋ฒ์งธ์ ์์ธ์์ ํฉํ ๊ฐ ์ค ํฐ ๊ฒ์ ์ ํํ ๋ค ํ์ฌ ์์ธ์์ ๊ฐ๊ณผ ํฉํด์ค๋ค. ๋ฐฉ๊ธ๋ ๋งํ์ง๋ง (N-1)๊น์ง N-1์ ๋ํ ๋์ ํฉ๊ณผ N-3์ ๋ํ ๋์ ํฉ์ด ๋ํด์ง๋ ๊ฒ์ด๋ฏ๋ก ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ์ด ๋์ค์ง ์๋๋ค.
๊ทธ๋ฆฌ๊ณ ํฌ๋์ฃผ ์์์์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ ์ธ ์ด๋ค ๊ฒ์ด ์ต๋๊ฐ์ด๋๋ฅผ ํ์ด๋ด์ผ ํ๋ค. ์๋ํ๋ฉด ์์ ๋ฐ๋ก์์๋ ๋ณด์ฌ์ฃผ์๋ฏ์ด ๋ง์ง๋ง dp์ ๊ฐ์ด ํญ์ ์ต๋๊ฐ์ ๋ณด์ฅํ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ต์ N-1 ์ ๋๊ธด ์ฌ๊ทํธ์ถ์ ๊ฐ๊ณผ๋ ๋น๊ตํ๋ ๊ฒ์ด๋ค. ์ฆ, N-1 ๋ฒ์งธ ๋์ ํฉ๊ณผ ํฐ ๊ฒ ์ค ํ๋๋ฅผ ์ ํํ์ฌ dp๋ฅผ ๊ฐฑ์ ํ๋ ๊ฒ์ด๋ค.
static int recur(int N) {
if(dp[N] == null) {
dp[N] = Math.max(Math.max(recur(N - 2), recur(N - 3) + arr[N - 1]) + arr[N], recur(N - 1));
}
return dp[N];
}
recur(N-2) ์ recur(N-3) + arr[N-1] ์ค ํฐ ๊ฐ์ด ๋ฐํ๋์์ ๋, ์ด ๊ฐ์ ์ด์ N์ธ recur(N-1)๊ณผ '๋น๊ต'ํ์ฌ dp[N]์ ์ต๋๊ฐ์ ๊ฐฑ์ ํ๋ ๊ฒ์ด๋ค. (๋น๊ต์ ๋ํ๋ ๊ฒ์ ์์ ํ ๋ค๋ฅด๋ค.)
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ๋ณ์ ์ค ํฐ ๊ฐ์ด dp[N]์ ๊ฐฑ์ ์ํค๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๊ฐฑ์ ์ํค๋ฉด ๊ฐ ๋ ธ๋๋ ์ด์ ์ ์ต๋๊ฐ๊ณผ ๋น๊ตํ๊ฒ ๋๋ฉฐ ์กฐํฉ ๊ฐ๋ฅํ ๊ฒ ์ค ์ต๋๊ฐ๋ง์ ์ ์ฅํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
[Bottom-Up]
for (int i = 3; i <= N; i++) {
dp[i] = Math.max(dp[i - 1], Math.max(dp[i - 2] + arr[i], dp[i - 3] + arr[i - 1] + arr[i]));
}
(i๊ฐ 3๋ถํฐ ์์ํ๋ ์ด์ ๋ dp[i - 3]์์ ์ธ๋ฑ์ค ์ฐธ์กฐ๊ฐ ๋ฒ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.)
Top-Down์์ ์ผ๋ ์ ํ์๊ณผ ํฌ๊ฒ ์ฐจ์ด๊ฐ ์๋๋ค. ๋ค๋ง Bottom-Up์ ๋ง ๊ทธ๋๋ ์๋(์์ ๊ฒ)๋ถํฐ ์(ํฐ ๊ฒ)๋ก ํ์ด๋๊ฐ๋ ๋ฐฉ์์ด๊ธฐ๋ค. ์ฆ, i = 3๋ถํฐ N๊น์ง ์์ฐจ์ ์ผ๋ก ์์๊ฐ๋ฉด์ ํ์ด๋๊ฐ๋ ๊ฒ์ด ํน์ง์ด๋ค.
ํ์ด ๋ฐ ์ฝ๋
- ๋ฐฉ๋ฒ 1 : [Scanner + Top-Down]
import java.util.Scanner;
public class Main {
static Integer[] dp;
static int[] arr;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
dp = new Integer[N + 1];
arr = new int[N + 1];
for(int i = 1; i < N + 1; i++) {
arr[i] = in.nextInt();
}
dp[0] = 0;
dp[1] = arr[1];
/*
* (N์ด 1๋ก ์ฃผ์ด์ง ์ ์์ผ๋ฏ๋ก ์ด๋ด ๋๋ฅผ ์ํด ์กฐ๊ฑด์์ ๋ฌ์๋๋ค.
* ๋ํ dp[2]๋ ์ด๋ค ๊ฒฝ์ฐ์๋ ์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ๋ฅผ ํฉํ ๊ฒ์ด ์ต๋๊ฐ์ด๋ค.
*/
if(N > 1) {
dp[2] = arr[1] + arr[2];
}
System.out.println(recur(N));
}
static int recur(int N) {
if(dp[N] == null) {
dp[N] = Math.max(Math.max(recur(N - 2), recur(N - 3) + arr[N - 1]) + arr[N], recur(N - 1));
}
return dp[N];
}
}
- ๋ฐฉ๋ฒ 2 : [Scanner + Bottom-Up]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] arr = new int[N + 1];
int[] dp = new int[N + 1];
for (int i = 1; i <= N; i++) {
arr[i] = in.nextInt();
}
dp[1] = arr[1];
if (N > 1) {
dp[2] = arr[1] + arr[2];
}
for (int i = 3; i <= N; i++) {
dp[i] = Math.max(dp[i - 1], Math.max(dp[i - 2] + arr[i], dp[i - 3] + arr[i - 1] + arr[i]));
}
System.out.println(dp[N]);
}
}
์์ Top-Down๋ฐฉ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก dp[1], dp[2]๋ฅผ ๊ฐ๊ฐ arr[1]๊ณผ arr[1] + arr[2]๋ก ์ด๊ธฐํ ํด์ฃผ์ด์ผ ํ๋ค. (dp[0]์ int[]๋ฐฐ์ด๋ก ๋ํดํธ๊ฐ์ด 0์ผ๋ก ์ด๊ธฐํ๋์ด์์ด์ ๋ฐ๋ก ์ํด์คฌ๋ค. ๋ค๋ง Top-Down์์๋ Integer[] ๋ฐฐ์ด์ ์ผ๊ธฐ ๋๋ฌธ์ dp[0] = 0 ์ด๋ผ๊ณ ํด์ฃผ์ด์ผ ํ๋ค.)