https://www.acmicpc.net/problem/15486

 

15486๋ฒˆ: ํ‡ด์‚ฌ 2

์ฒซ์งธ ์ค„์— N (1 โ‰ค N โ‰ค 1,500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— Ti์™€ Pi๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด์„œ ์ฃผ์–ด์ง€๋ฉฐ, 1์ผ๋ถ€ํ„ฐ N์ผ๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค Ti โ‰ค 50, 1 โ‰ค Pi โ‰ค 1,000)

www.acmicpc.net

 

 

 

 

 

 

๋ฌธ์ œ

  • ์˜ค๋Š˜๋ถ€ํ„ฐ N+1์ผ์งธ ๋˜๋Š” ๋‚  ํ‡ด์‚ฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๋‚จ์€ N์ผ ๋™์•ˆ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์ƒ๋‹ด์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
  • ๊ฐ๊ฐ์˜ ์ƒ๋‹ด์€ ์ƒ๋‹ด์„ ์™„๋ฃŒํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ๊ธฐ๊ฐ„ Ti์™€ ์ƒ๋‹ด์„ ํ–ˆ์„ ๋•Œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก Pi๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
  • ์ƒ๋‹ด์„ ์ ์ ˆํžˆ ํ–ˆ์„ ๋•Œ, ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ˆ˜์ต ๊ตฌํ•˜๊ธฐ

 

์ถœ์ฒ˜ : https://www.acmicpc.net/problem/15486

 

 

์ œํ•œ์‚ฌํ•ญ

  • N (1 โ‰ค N โ‰ค 1,500,000)
  • 1 โ‰ค Ti โ‰ค 50, 1 โ‰ค Pi โ‰ค 1,000

 

 

 

 

 

ํ’€์ด

  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

 ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์กฐ๊ฑด์ธ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๋งŒ์กฑํ•œ๋‹ค. ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ตœ์  ๊ฐ’์„ ์ด์šฉํ•ด ์ „์ฒด ๋ฌธ์ œ์˜ ์ตœ์  ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์˜ˆ์ œ1์˜ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, 7์ผ์ด ๋˜๋Š” ๋‚ ์˜ ์ตœ๋Œ“๊ฐ’์€ 5์ผ์ด ๋˜๋Š” ๋‚ ์˜ ์ตœ๋Œ“๊ฐ’์—์„œ ๊ทธ ๋‚ ์˜ ๊ธˆ์•ก์„ ๋”ํ•œ ๊ฐ’์ด ๋œ๋‹ค.

 

 ์–ด๋–ค ๋‚ ๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ธˆ์•ก์„ ์ €์žฅํ•˜๊ณ , ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ dp[i]๋Š” i์ผ๊นŒ์ง€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ˆ˜์ต์ด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  DP์˜ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” ๋ฌธ์ œ์—์„œ N + 1์งธ ๋˜๋Š” ๋‚  ํ‡ด์‚ฌ๋ฅผ ํ•œ๋‹ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์›๋ž˜์˜ ํฌ๊ธฐ์ธ N์—์„œ 1์„ ๋” ์ถ”๊ฐ€ํ•ด์คฌ๋‹ค. ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, DP์˜ ์ดˆ๊ธฐ๊ฐ’์€ ๋ชจ๋‘ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. 

 

 

  • DP ๋ฐฐ์—ด ์ฑ„์šฐ๊ธฐ

 ์ฒซ์งธ๋‚ ์ธ 1์ผ๋ถ€ํ„ฐ N์ผ๊นŒ์ง€ DP ๋ฐฐ์—ด์„ ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค. ํ˜„์žฌ ์ƒ๋‹ด์„ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด, '๋‹ค์Œ ์ƒ๋‹ด์— ๋ฐ›๊ฒŒ ๋  ๊ธˆ์•ก'์€ 'ํ˜„์žฌ๊นŒ์ง€์˜ ๊ธˆ์•ก์˜ ์ตœ๋Œ€๊ฐ’'์— '์ง€๊ธˆ ์ƒ๋‹ด์„ ํ•  ๊ฒฝ์šฐ์˜ ๊ธˆ์•ก'์„ ๋”ํ•œ ๊ฐ’์ด ๋  ๊ฒƒ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ๊ทธ ๊ฐ’์ด ์ตœ๋Œ€๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค.

1์ผ 2์ผ 3์ผ 4์ผ
2 2 1 1
3 15 10 5

 

 

๋จผ์ €, 1์ผ์— ์ƒ๋‹ด์„ ํ•˜๋ฉด, 3์ผ๊นŒ์ง€ 3์„ ๋ฐ›์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  2์ผ์—๋Š” ์ƒ๋‹ด์„ ํ•˜๋ฉด, 4์ผ๊นŒ์ง€ 15๋ฅผ ๋ฐ›์„ ๊ฒƒ์ด๋‹ค. (์ด๋ฏธ ์ตœ๋Œ“๊ฐ’)

๊ทธ๋ฆฌ๊ณ  3์ผ์—๋Š” ์ƒ๋‹ด์„ ํ•˜๋ฉด 4์ผ๊นŒ์ง€ 3 + 10์„ ๋ฐ›์„ ๊ฒƒ์ด๋‹ค. 

 

dp[i + time] = Math.max(dp[i + time], dp[i] + pay)

 

 ์ด๋ฏธ ์•ž์„œ ์ตœ๋Œ“๊ฐ’์ด ๋‚˜์™”์œผ๋ฏ€๋กœ, '๋‹ค์Œ ์ƒ๋‹ด์— ๋ฐ›๊ฒŒ ๋  ๊ธˆ์•ก'์€ 'ํ˜„์žฌ๊นŒ์ง€์˜ ๊ธˆ์•ก์˜ ์ตœ๋Œ€๊ฐ’'์— '์ง€๊ธˆ ์ƒ๋‹ด์„ ํ•  ๊ฒฝ์šฐ์˜ ๊ธˆ์•ก'์„ ๋”ํ•œ ๊ฐ’๊ณผ '๋‹ค์Œ ์ƒ๋‹ด์— ๋ฐ›๊ฒŒ๋  ๊ธˆ์•ก์˜ ์ตœ๋Œ“๊ฐ’' ์ค‘ ํฐ ๊ฐ’์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

 

 

 

 

๋ฐ˜๋ก€) ์ƒ๋‹ด์„ ์•ˆํ•˜๊ณ  ๋„˜๊ธธ ์ˆ˜๋„ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์ฒ˜๋ฆฌํ•˜๊ธฐ

 

์˜ˆ์ œ4์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด, ํ•ด๋‹น ์ผ์— ์ƒ๋‹ด์„ ์•ˆํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

1) 7์ผ์— ์ƒ๋‹ด์„ ํ•˜๋Š” ๊ฒฝ์šฐ

1์ผ 2์ผ 3์ผ 4์ผ 5์ผ 6์ผ 7์ผ 8์ผ 9์ผ 10์ผ
5 4 3 2 1 1 2 3 4 5
50 40 30 20 10 10 20 30 40 50

 

50 + 10 + 30 = 80

 

 

2) 7์ผ์— ์ƒ๋‹ด์„ ์•ˆํ•˜๋Š” ๊ฒฝ์šฐ

1์ผ 2์ผ 3์ผ 4์ผ 5์ผ 6์ผ 7์ผ 8์ผ 9์ผ 10์ผ
5 4 3 2 1 1 2 3 4 5
50 40 30 20 10 10 20 30 40 50

 

50 + 10 + 30 = 90 ์œผ๋กœ ๋” ํฌ๋‹ค.

 

 

dp[i + 1] = Math.max(dp[i + 1], dp[i])

 

 7์ผ์—์„œ ์ƒ๋‹ด์„ ํ•˜์ง€ ์•Š์œผ๋ฉด, 8์ผ์—๋Š” 7์ผ์˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ ์ด๋ฏธ ์ตœ๋Œ“๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์ด๋ฏธ ์žˆ๋Š” ์ตœ๋Œ“๊ฐ’์ด 8์ผ์˜ ๊ฐ’์ด ๋  ๊ฒƒ์ด๋‹ค. 

 

 

 

 

 

์ฝ”๋“œ

import java.io.*;
import java.util.*;

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[][] arr = new int[N + 1][2];
		
		for(int i = 1; i <= N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			arr[i][0] = Integer.parseInt(st.nextToken());
			arr[i][1] = Integer.parseInt(st.nextToken());
		}
		
		int[] dp = new int[N + 2];
		
		for(int i = 1; i <= N; i++) {
			int time = arr[i][0];
			int pay = arr[i][1];
			
			if(i + time <= N + 1) {
				dp[i + time] = Math.max(dp[i + time], dp[i] + pay);
			}
			
			dp[i + 1] = Math.max(dp[i + 1], dp[i]);
		}
		
		System.out.println(dp[N + 1]);
	}

}

 

 

 

 

๊ฒฐ๊ณผ

 

 

 

 

๋ฐฐ์šด์ 

giraffe_