# 유형 : 다이나믹 프로그래밍

# https://www.acmicpc.net/problem/11055, https://www.acmicpc.net/problem/11053, https://www.acmicpc.net/problem/11722 를 풀어봤다면 문제 접근은 어렵지 않다. 특정 인덱스 까지의 앞에서부터의 증가하는 부분수열 + 뒤에서부터의 증가하는 부분수열을 생각한다면 바로 풀 수 있다.

 

11722번: 가장 긴 감소하는 부분 수열

수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10}  이고, 길이는 3이다.

www.acmicpc.net

 

11055번: 가장 큰 증가 부분 수열

수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수열은 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 이고, 합은 113이다.

www.acmicpc.net

 


package bj;

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

public class p11054 {
	static int N;
	static int arr[];
	static int dp[];
	static int m_dp[];
	static int max=0;
	public static void main(String[] args) throws IOException {
		 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		 N = Integer.parseInt(br.readLine());
		 arr = new int[N];
		 dp = new int[N];
		 m_dp = new int[N];
		 StringTokenizer st = new StringTokenizer(br.readLine());
		 for(int i=0; i<N; i++) {
			 arr[i] = Integer.parseInt(st.nextToken());
		 }
		 for(int i=0; i<N; i++) {
			 dp[i] = 1;
			 for(int j=0; j<i; j++) {
				 if(arr[i] > arr[j]) {
					 if(dp[i] < dp[j]+1)
						 dp[i] = dp[j]+1;
				 }
			 }
		 }
		 
		 for(int i=N-1; i>=0; i--) {
			 m_dp[i]=1;
			 for(int j=N-1; j>i; j--) {
				 if(arr[i] > arr[j]) {
					 if(m_dp[i] < m_dp[j]+1)
						 m_dp[i] = m_dp[j]+1;
				 }
			 }
		 }
		 for(int i=0; i<N; i++) {
			 max = Math.max(max, dp[i]+m_dp[i]-1);
		 }
		 System.out.println(max);
		 
	}
}

+ Recent posts