본문 바로가기
Problem Solving

[BOJ 11053] 가장 긴 증가하는 부분 수열

by Ladun 2020. 4. 7.

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


가장 긴 증가하는 부분 수열의 길이를 구하는 문제이다. 

 

굳이 연속적인 배열이 아니여도 상관없다.

 

주어진 수열을 순회하면서, 각 순회마다 현재위치에서 첫번째 위치까지 돌면서 각 위치의 값보다 현재 위치의 값이 크면 현재 위치까지의 가장 긴 증가수열은 각 위치의 길이 + 1이다.

 

이를 통해서 구하면 된다.

 

자세한 내용은 LIS에 있다.

 


#include <stdio.h>
#define max(a, b) ((a) > (b) ? (a) : (b))

int n;
int a[1001];
int dp[1001];

int main()
{
	scanf("%d", &n);

	for (int i = 1; i <= n; i++)
		scanf("%d", a + i);
	int ans = 0;
	for (int i = 1; i <= n; i++)
	{
		dp[i] = 1;
		for (int j = i - 1; j >= 1; j--)
		{
			if (a[i] > a[j])
				dp[i] = max(dp[i], dp[j] + 1);
		}
		ans = max(ans, dp[i]);
	}
	printf("%d", ans);
}