[Algorithm] ๐Ÿ“ฆ๋ฐฑ์ค€ 1965 ์ƒ์ž๋„ฃ๊ธฐ

HaJingJingยท2021๋…„ 4์›” 30์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
27/119

0. ๋ฌธ์ œ

์ •์œก๋ฉด์ฒด ๋ชจ์–‘์˜ ์ƒ์ž๊ฐ€ ์ผ๋ ฌ๋กœ ๋Š˜์–ด์„œ ์žˆ๋‹ค. ์ƒ์ž๋งˆ๋‹ค ํฌ๊ธฐ๊ฐ€ ์ฃผ์–ด์ ธ ์žˆ๋Š”๋ฐ, ์•ž์— ์žˆ๋Š” ์ƒ์ž์˜ ํฌ๊ธฐ๊ฐ€ ๋’ค์— ์žˆ๋Š” ์ƒ์ž์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์œผ๋ฉด, ์•ž์— ์žˆ๋Š” ์ƒ์ž๋ฅผ ๋’ค์— ์žˆ๋Š” ์ƒ์ž ์•ˆ์— ๋„ฃ์„ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•ž์—์„œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ํฌ๊ธฐ๊ฐ€ (1, 5, 2, 3, 7)์ธ 5๊ฐœ์˜ ์ƒ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด, ํฌ๊ธฐ 1์ธ ์ƒ์ž๋ฅผ ํฌ๊ธฐ 5์ธ ์ƒ์ž์— ๋„ฃ๊ณ , ๋‹ค์‹œ ์ด ์ƒ์ž๋ฅผ ํฌ๊ธฐ 7์ธ ์ƒ์ž ์•ˆ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ƒ์ž๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์•ž์˜ ์˜ˆ์—์„œ ์ฐจ๋ก€๋Œ€๋กœ ํฌ๊ธฐ๊ฐ€ 1, 2, 3, 7์ธ ์ƒ์ž๋ฅผ ์„ ํƒํ•˜๋ฉด ์ด 4๊ฐœ์˜ ์ƒ์ž๊ฐ€ ํ•œ ๊ฐœ์˜ ์ƒ์ž์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

์ƒ์ž์˜ ํฌ๊ธฐ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ํ•œ ๋ฒˆ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€์˜ ์ƒ์ž ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
ํŒŒ์ผ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์€ ์ƒ์ž์˜ ๊ฐœ์ˆ˜ n (1 โ‰ค n โ‰ค 1000)์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” ๊ฐ ์ƒ์ž์˜ ํฌ๊ธฐ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ƒ์ž์˜ ํฌ๊ธฐ๋Š” 1,000์„ ๋„˜์ง€ ์•Š๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ
์ฒซ์งธ ์ค„์— ํ•œ ์ค„์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€์˜ ์ƒ์ž ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


1. ์•„์ด๋””์–ด

  1. dp์˜ ์ดˆ๊ธฐ๊ฐ’์€ 1
  2. arr ์•ž์— ์ˆซ์ž๋“ค๊ณผ ๋น„๊ตํ•ด์„œ ๋” ์ž‘์€ ๊ฒƒ๋“ค ์ค‘
    dp๊ฐ€ ์ œ์ผ ํฐ ๊ฐ’+1์„ ํ•˜์—ฌ dp ๊ฐ’์„ ์ •ํ•จ


2. ํ•ต์‹ฌ ํ’€์ด

1) dp์˜ ์ดˆ๊ธฐ๊ฐ’์€ 1

Arrays.fill(dp, 1);

2) arr ์•ž์— ์ˆซ์ž๋“ค๊ณผ ๋น„๊ตํ•ด์„œ ๋” ์ž‘์€ index๋“ค ์ค‘
dp๊ฐ€ ์ œ์ผ ํฐ ๊ฐ’+1์„ ํ•˜์—ฌ dp ๊ฐ’์„ ์ •ํ•จ

right[m] = dp[r-1][m] + map[r][m];
for(int c=m-1; c>=1; c--)
		right[c] = Math.max(right[c+1], dp[r-1][c]) + map[r][c];

๋‘ ๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ’ ์ค‘ ๋” ํฐ ๊ฐ’ dp์— ์ €์žฅ

for(int i=2; i<n; i++) {
			for(int j=0; j<i; j++) {
				if(arr[i] > arr[j])
					dp[i] = Math.max(dp[i], dp[j]+1);
			}
}

3. ์ฝ”๋“œ

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

public class DP_10 {
	static int arr[], n, dp[];
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		arr = new int[n];
		dp = new int[n];
		
		String s[] = br.readLine().split(" ");
		
		for(int i=0; i<n; i++) 
			arr[i] = Integer.parseInt(s[i]);
		
		
		Arrays.fill(dp, 1);
		dp[1] = arr[0] >= arr[1] ? 1 : 2;
		System.out.println(box());
	}
	
	static int box() {
		int ret = -1;
		
		for(int i=2; i<n; i++) {
			for(int j=0; j<i; j++) {
				if(arr[i] > arr[j])
					dp[i] = Math.max(dp[i], dp[j]+1);
			}
			
			ret = Math.max(dp[i],ret);
		}
		
		return ret;
	}

}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณต~

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€