https://www.acmicpc.net/problem/11053
11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이
www.acmicpc.net
위의 예제를 바탕으로 풀어보면 다음과 같다.
맨 처음 dp[0] 값은 1로 설정하고
arr[1] 의 값이 arr[0] 보다 크면
dp[1] 의 값은 dp[0] 에 1을 더한 2로 설정한다.
arr[2] 의 값이 arr[0] , arr[1] 보다 크지 않기 때문에
dp[2] 의 값은 1로 설정한다.
arr[3] 의 값이 arr[0], arr[1], arr[2] 보다 크기 때문에
dp[3] 의 값은 dp 값 중 가장 큰 값 2에 1을 더한 3으로 설정한다.
arr[4] 의 값이 10 보다 크기 때문에
dp[4] 의 값은 10 의 값을 가지고 있는 dp[2] 에 1을 더한 2로 설정한다.
arr[5] 의 값이 30 보다 크기 때문에
dp[5] 의 값은 30 의 값을 가지고 있는 dp[3] 에 1을 더한 4로 설정한다.
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int arr[] = new int[N];
int dp[] = new int[N];
for(int i=0;i<N;i++)
{
arr[i] = sc.nextInt();
}
dp[0]=1;
for(int i=1;i<N;i++)
{
dp[i]=1;
for(int j=0;j<i;j++)
{
if(arr[i]>arr[j]&&dp[i]<=dp[j])
{
dp[i]=dp[j]+1;
}
}
}
int max=dp[0];
for(int i=1;i<N;i++)
{
if(max<dp[i])
max=dp[i];
}
System.out.println(max);
}
}
'알고리즘 > 백준 풀이(동적 프로그래밍)' 카테고리의 다른 글
백준 1010번 - 다리 놓기 (1) | 2024.01.11 |
---|---|
백준 9461번 - 파도반 수열 (0) | 2024.01.11 |
백준 2193번 - 이친수 (0) | 2024.01.09 |
백준 2156번 - 포도주 시식 (1) | 2024.01.08 |
백준 1912번 - 연속합 (1) | 2024.01.05 |