오답노트

[DP] 11722번 가장 긴 감소하는 부분 수열 본문

C,C++/코딩테스트

[DP] 11722번 가장 긴 감소하는 부분 수열

권멋져 2022. 5. 17. 18:37
https://www.acmicpc.net/problem/11722
 

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

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

www.acmicpc.net

- 문제 파악

수열이 주어지고, 수열 중 일부를 선택하여 감소하는 부분 수열을 만들 수 있는 경우 중에서 수열의 길이가 가장 긴 값을 출력하라.

 

- 정답

가장 긴 증가하는 부분 수열 감소 버전이다.

 

기준이 되는 수열을 하나 지정하고(i), 0부터 i-1까지 배열들 중에서 자신보다 작은 수열들이 존재하면, 자신 보다 작은 수열이 가질 수 있는 최대 길이와 나 자신을 더한 것과 현재 i가 가질 수 있는 최대 길이를 비교한다.

 

#include "bits/stdc++.h"

using namespace std;

int n;
int D[1001];
int arr[1001];
int ans = 1;


int main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> arr[i];

	for (int i = 0; i < n; i++)
	{
		D[i] = 1;
		for (int j = 0; j < i; j++)
		{
			if (arr[i] >= arr[j])
				continue;

			D[i] = max(D[j] + 1, D[i]);
		}

		ans = max(D[i], ans);
		
	}

	cout << ans;

}