11월 6일(월) - 다이나믹 프로그래밍 (14501번)
14501번: 퇴사
첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.
www.acmicpc.net
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
문제점
1. time, pay, dp 배열의 크기를 설정하는 과정에서 ArrayIndexOutOfBoundsException 이 발생
-> time 과 pay의 크기는 N+1에서 부족할 이유가 없음
-> dp의 크기를 N+2개로 늘렸더니 해결
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이
(C언어 풀이 활용)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] time = new int[N+1];
int[] pay = new int[N+1];
int[] dp = new int[N+2];
StringTokenizer st;
for(int i=1; i<=N; i++)
{
st = new StringTokenizer(br.readLine());
time[i] = Integer.parseInt(st.nextToken());
pay[i] = Integer.parseInt(st.nextToken());
}
for(int i=N; i>0; i--)
{
int dead_line = i + time[i];
if(dead_line <= N+1)
{
dp[i] = Math.max(dp[i+1], dp[dead_line] + pay[i]);
}
else
{
dp[i] = dp[i+1];
}
}
System.out.println(dp[1]);
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
'백준(Java) > 23년 11월' 카테고리의 다른 글
[Java] 백준 - 2133번: 타일 채우기 (0) | 2023.11.13 |
---|---|
[Java] 백준 - 2206번: 벽 부수고 이동하기 (0) | 2023.11.10 |
[Java] 백준 - 1182번: 부분수열의 합 (0) | 2023.11.09 |
[Java] 백준 - 2437번: 저울 (0) | 2023.11.08 |
[Java] 백준 - 1717번: 집합의 표현 (0) | 2023.11.07 |
댓글