https://www.acmicpc.net/problem/2156
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
static int[] size;
static Integer[] dp;
public int findMaxSize(int num) {
if(dp[num] == null) {
dp[num] = Math.max(Math.max(findMaxSize(num - 2), findMaxSize(num - 3) + size[num - 1]) + size[num], findMaxSize(num - 1));
}
return dp[num];
}
public int getMaxSize() {
dp = new Integer[size.length];
dp[0] = size[0];
dp[1] = size[1];
if(size.length - 1 >= 2) {
dp[2] = size[1] + size[2];
}
return findMaxSize(dp.length - 1);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int num = Integer.parseInt(br.readLine());
size = new int[num + 1];
for(int i = 1; i <= num; i++) {
size[i] = Integer.parseInt(br.readLine());
}
br.close();
Main m = new Main();
bw.write(m.getMaxSize() + "\n");
bw.flush();
bw.close();
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public int getMaxSize(int[] size) {
int[] dp = new int[size.length];
dp[1] = size[1];
if(size.length - 1 >= 2) {
dp[2] = size[1] + size[2];
}
for(int i = 3; i < dp.length; i++) {
dp[i] = Math.max(Math.max(dp[i - 2], dp[i - 3] + size[i - 1]) + size[i], dp[i - 1]);
}
return dp[dp.length - 1];
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int num = Integer.parseInt(br.readLine());
int[] size = new int[num + 1];
for(int i = 1; i <= num; i++) {
size[i] = Integer.parseInt(br.readLine());
}
br.close();
Main m = new Main();
bw.write(m.getMaxSize(size) + "\n");
bw.flush();
bw.close();
}
}
public int findMaxSize(int num) {
if(dp[num] == null) {
dp[num] = Math.max(findMaxSize(num - 2), findMaxSize(num - 3) + size[num - 1]) + size[num];
}
return dp[num];
}
public int findMaxSize(int num) {
if(dp[num] == null) {
dp[num] = Math.max(Math.max(findMaxSize(num - 2), findMaxSize(num - 3) + size[num - 1]) + size[num], findMaxSize(num - 1));
}
return dp[num];
}
주어진 포도주 잔들에서의 최대로 마실 수 있는 양을 나타내는 dp 배열을 생성하고 값을 초기화시킵니다.
재귀함수를 통하여 최대로 마실 수 있는 포도주 양을 구합니다.
2번의 재귀함수를 통해 구한 최대로 마실 수 있는 포도주 양을 출력합니다.
for(int i = 3; i < dp.length; i++) {
dp[i] = Math.max(dp[i - 2], dp[i - 3] + size[i - 1]) + size[i];
}
for(int i = 3; i < dp.length; i++) {
dp[i] = Math.max(Math.max(dp[i - 2], dp[i - 3] + size[i - 1]) + size[i], dp[i - 1]);
}