https://www.acmicpc.net/problem/11053
11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
www.acmicpc.net
점화식은 for를 돌면서 본인보다 이전에 나온 수의 크기가 더 작으면 그수에 1 증가 한 수를 dp에 저장하는 방법으로 해결했다. 이런 식으로 해결하면 현재값이 나온 수들 중 가장 큰 값이라면 이전까지 나온 수들 중 가장 큰 dp값에 1을 더하게 된다.
if(arr[j]<arr[i] && dp[i]<=dp[j] ){
dp[i] = dp[j] +1;
}
풀이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package 동적계획법; import java.io.*; import java.util.*; public class 가장긴_증가하는_부분수열 { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); StringTokenizer st = new StringTokenizer(br.readLine()); int[] arr = new int[n + 1]; int[] dp = new int[n + 1]; for (int i = 1; i <= n; i++) { arr[i] = Integer.parseInt(st.nextToken()); } Arrays.fill(dp, 1); for (int i = 2; i <= n; i++) { for (int j = 1; j < i; j++) { //이전에 지나온 수열들 중 가장 큰 값 if (arr[j] < arr[i] && dp[j] >= dp[i]) { dp[i] = dp[j] + 1; } } } int res = 0; for(int i:dp){ res = Math.max(i,res); } System.out.println(res); } } | cs |
'IT > 알고리즘' 카테고리의 다른 글
프로그래머스 큰 수 만들기 (0) | 2020.05.14 |
---|---|
프로그래머스 저울 문제 - Greedy (1) | 2020.05.10 |
백준 2156 포도주시식 (0) | 2020.05.05 |
백준10844 쉬운 계단 수 (0) | 2020.05.04 |
백준2579 계단오르기 (0) | 2020.05.03 |