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

 

2156번: 포도주 μ‹œμ‹

νš¨μ£ΌλŠ” 포도주 μ‹œμ‹νšŒμ— κ°”λ‹€. κ·Έ 곳에 κ°”λ”λ‹ˆ, ν…Œμ΄λΈ” μœ„μ— λ‹€μ–‘ν•œ 포도주가 λ“€μ–΄μžˆλŠ” 포도주 μž”μ΄ 일렬둜 놓여 μžˆμ—ˆλ‹€. νš¨μ£ΌλŠ” 포도주 μ‹œμ‹μ„ ν•˜λ €κ³  ν•˜λŠ”λ°, μ—¬κΈ°μ—λŠ” λ‹€μŒκ³Ό 같은 두 가지 규

www.acmicpc.net

 

 

 

 

주어진 λ°°μ—΄μ—μ„œ μ—°μ†ν•΄μ„œ 3κ°œκΉŒμ§€ 선택할 수 μ—†κ³  μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λŠ” 문제둜 이전에 ν’€μ—ˆλ˜ κ³„λ‹¨μ˜€λ₯΄κΈ°(https://www.acmicpc.net/problem/2579)와 λΉ„μŠ·ν•œ λ¬Έμ œμ΄λ‹€. κ³„λ‹¨μ˜€λ₯΄κΈ°μ—μ„œλŠ” 도착 지점을 무쑰건 선택해야 ν•˜μ§€λ§Œ 포도주 μ‹œμ‹μ—μ„œλŠ” 상관 μ—†λ‹€. κ·Έλž˜μ„œ μ„ νƒν•˜μ§€ μ•ŠλŠ” 경우λ₯Ό μΆ”κ°€ν•˜λ©° 경우의 μˆ˜κ°€ ν•˜λ‚˜ 더 λŠ˜μ—ˆλ‹€.

 

 

 

 

 

μ΄ˆκΈ°κ°’ (n = 1, n= 2)

dp[1] = glass[1]

dp[2] = glass[1] + glass[2]

 

 

n > 2 μΌλ•Œ,

case 1

n- 3
  dp  
n-2

n-1
선택
n
선택

dp[n] = glass[n] + glass[n - 1] + dp[n - 3]

 

 

case 2

n- 3
    
n-2
  dp  
n-1

n
선택

dp[n] = glass[n] + dp[n - 2]

 

 

case 3

n- 3
    
n- 2
    
n- 1
  dp  
n
선택X

dp[n] = dp[n - 1]

 

 

3개 쀑 μ΅œλŒ“κ°’μ„ μ„ νƒν•˜λ©΄ λœλ‹€.

 

 

 

 

 

μ½”λ“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class WineTasting {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int n = Integer.parseInt(br.readLine());
		
		int[] glass = new int[n + 1];
		
		for(int i = 1; i <= n; i++) {
			glass[i] = Integer.parseInt(br.readLine());
		}
		
		int[] dp = new int[n + 1];
		
		dp[1] = glass[1];
		
		if(n >= 2) {
			dp[2] = glass[1] + glass[2];
		}
		
		for(int i = 3; i <= n; i++) {
			dp[i] = Math.max(dp[i - 1], Math.max(glass[i - 1] + dp[i - 3], dp[i - 2]) + glass[i]);
		}
		
		System.out.println(dp[n]);
	}

}

 

 

μž…λ ₯값인 n이 1뢀터이기 λ•Œλ¬Έμ— dp[2]μ—λŠ” 쑰건을 λ‹¬μ•„μ£ΌλŠ” 것을 μžŠμ§€ 말아야 ν•œλ‹€. 쑰건을 μ•ˆ 달면 μ—λŸ¬κ°€ λ‚œλ‹€.

 

 

 

 

 

κ²°κ³Ό

 

giraffe_