백준 c++/(1-1)백준 c++ 알고리즘 기초

백준 11053 c++ 가장 긴 증가하는 부분 수열

현구구 2022. 7. 19. 14:20

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


문제

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.

예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.

입력

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.

둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)

출력

첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.


#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> arr(1001);//전체수열을 담을 vector
	vector<int> dp(1001,1);//부분수열의 최대 길이를 담을 vector 크기는 모두 1로 초기화
	int N;
	cin >> N;
	for (int i = 1; i <= N; i++)
	{
		cin >> arr[i];
	}
	dp[1] = 1;//1개의 수열의 최대 길이는 1
	for (int i = 2; i <= N; i++)
	{
		for (int j = 1; j < i; j++)
		{
			if (arr[j] < arr[i])
			{
				dp[i] = max(dp[j] + 1, dp[i]);//모든 dp값을 비교하며 최대값 저장
			}
		}
	}
	int result = 1;
	for (int i = 1; i <=N; i++)
	{
		result = max(result, dp[i]);//1부터 N까지 중 증가집합의 길이가 가장 긴 길이를 출력
	}
	cout << result;
}

dp[n]은 n이 부분 수열의 최대값일 때 부분수열의 길이 값이다.

 

수열이 {1, 3, 2} 다음과 같을 때 

dp[1] = 1

 

arr[2](=3) > arr[1](=2) 이므로

dp[2] = max(dp[1]+1, dp[2]) = max(2,1) = 2

 

arr[3](=2) > arr[1](=1) 이므로

dp[3] = max(dp[1]+1, dp[3]) = max(2,1) = 2

arr[3](=2) > arr[2](=3) 를 만족하지 못하므로

dp[3]은 그대로 2

 

 

for문을 돌려 부분집합 중 가장 큰 dp값을 result에 저장하고 출력한다.

다음과 같이 dp[4] 가 dp[7]보다 더 큰 경우가 있기 때문이다