Algorithm/DP

BOJ#14501 퇴사

밤이2209 2017. 4. 22. 22:20

BOJ#14501 퇴사


* 문제



* 풀이

2017년 상반기 삼성전자 SW 역량테스트 기출문제입니다.

dp 문제입니다. 각 경우(상담)에 대해 상담하는 경우, 상담하지 않는 경우 2가지 경우로 나눌 수 있습니다.

정의 및 점화식
dp[idx] : 날짜가 idx 일 때, 이후 얻을 수 있는 금액의 최대값
dp[idx] = max(dp[idx+1], dp[idx + T[idx]] + P[idx])



* 나의 코드

https://github.com/stack07142/BOJ/blob/master/BOJ%2314501_Retire/src/Main.java


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

/**
* BOJ#14501 퇴사
* https://www.acmicpc.net/problem/14501
*/

public class Main {

static final int INF = 10000000;

static int[] T = new int[16];
static int[] P = new int[16];
static int[] dp = new int[16];
static int N;

static {

Arrays.fill(dp, -1);
}

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

N = Integer.parseInt(br.readLine());

for (int i = 1; i < N + 1; i++) {

StringTokenizer st = new StringTokenizer(br.readLine());
T[i] = Integer.parseInt(st.nextToken());
P[i] = Integer.parseInt(st.nextToken());
}

System.out.println(solve(1));
System.out.println(Arrays.toString(dp));
}

// return dp[idx] : 날짜가 idx일때 이후 더 받을 수 있는 금액의 최대값
static int solve(int idx) {

// 기저 사례 : 날짜가 N+1일 때
if (idx == N + 1) return 0;

// 기저 사례 : 날짜가 N+1을 넘을 경우
if (idx > N + 1) return -INF;

// memoization
if (dp[idx] != -1) return dp[idx];

return dp[idx] = Math.max(solve(idx + 1), solve(idx + T[idx]) + P[idx]);
}
}


'Algorithm > DP' 카테고리의 다른 글

BOJ#1010 다리 놓기  (0) 2017.05.09
BOJ#9084 동전  (0) 2017.05.01
BOJ#1937 욕심쟁이 판다  (0) 2017.04.12
BOJ#2666 벽장문의 이동  (0) 2017.04.08
BOJ#5557 1학년  (0) 2017.04.08