ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DP] BOJ 11053 번 문제 풀이
    백준 문제풀이/Dynamic Programming 2019. 5. 13. 15:05

    문제분석

     

    DP 유형의 문제들은 점화식을 도출하는 것이

    문제의 전부입니다!!

     

     

    D[i] = i 번째 인덱스를 마지막으로 하는 수열의 최대 길이

    arr[i] = 주어진 수열

    이라고 정의하고 시작하겠습니다.

     

    그러면, D[1] = 1 은 자명합니다.

     

    D[2] 부터는 주어진 수열의 데이터를 비교해야 합니다.

     

    1. 이전 값 중에 arr[2] 보다 작은 값들을 모두 후보 인덱스로 둡니다.

    2. D[후보 인덱스] 중에 최댓값을 구합니다. 

    3. 그 최댓값에 자기 자신인 1을 더해줍니다.

     

    설명이 조금 복잡하니 예시문제로 다시 봅시다.

     

    10 20 10 30 20 50

     

    이러한 수열이 있습니다.

    이때, D[4] 를 구하고자 합니다.

    그러면 우선 arr[4] = 30 의 값 보다 작은 값들을 

    이전 인덱스에서 색출합니다.

     

    10 20 10 30 20 50

     

    초록색 친구들이 되겠네요. ㅎㅎㅎ

    이 친구들의 인덱스는 1, 2, 3 입니다. 

     

    그러면 이미 구해져 있는 D[1], D[2], D[3] 중 최댓값을 찾고

     

    D[4] = MAX + 1

     

    자기 자신을 포함한 길이를 출력해야 하니 1을 더해주면 되겠네요.

     

     

    코드

     

    #include "bits/stdc++.h"
    
    using namespace std;
    
    int d[1005];
    int arr[1005];
    
    int main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	int n;
    
    	cin >> n;
    	//입력된 수열 저장
    	for (int i = 0; i < n; i++)
    		cin >> arr[i];
    
    	d[0] = 1; // 항상 자명한 값
    
    	for (int i = 1; i < n; i++)
    	{
    		int mx = 0;
    
    		for (int j =0; j < i; j++)
    		{
    			if (arr[i] > arr[j])
    			// 현재 인덱스 보다 작은 경우
    			{
    				mx = max(mx, d[j]);
    			}
    		}
    		d[i] = mx + 1;
    	}// 가장 긴 수열에 자신(1)을 더함
    	cout << *max_element(d, d + n + 1);
    	//배열 값 중 가장 큰 값 출력
    	return 0;
    }

     

    '백준 문제풀이 > Dynamic Programming' 카테고리의 다른 글

    [DP] BOJ 9465 : 스티커  (0) 2019.08.30
    [DP] BOJ 2193 : 이친수  (0) 2019.08.30
    [DP] BOJ 1912 번 문제풀이  (0) 2019.05.11
    [DP] BOJ 11726 번 문제  (0) 2019.05.11
    [DP] BOJ 1149 번 문제 풀이  (0) 2019.05.06

    댓글

Designed by Tistory.