https://www.acmicpc.net/problem/11053

 

가장 긴 증가하는 부분 수열 LIS를 해결하는 방법 중에 DP를 사용해서 풀어보겠다. 

주어진 배열의 각 위치에 대해, 그 위치까지의 LIS 길이를 저장하는 벡터를 만들고 처음에는 각 원소가 자기 자신만 포함하더라도 수열의 길이는 1이므로, dp 배열의 모든 값을 1로 초기화한다. 

dp[i]는 i번째 원소를 마지막으로 하는 가장 긴 증가 부분 수열의 길이이고 이를 구해야한다. 

예제 입력을 바탕으로 설명해보자면 

 

  • i=1 (값: 10)
    • 10보다 앞에 있는 수가 없으므로, dp[1] = 1.
    • 현재 dp 상태: [1, 1, 1, 1, 1, 1]
  • i=2 (값: 20)
    • 앞에 있는 수 10은 20보다 작으므로, dp[2] = dp[1] + 1 = 2.
    • 현재 dp 상태: [1, 2, 1, 1, 1, 1]
  • i=3 (값: 10)
    • 앞에 있는 수 중 10보다 작은 수는 없으므로, dp[3] = 1.
    • 현재 dp 상태: [1, 2, 1, 1, 1, 1]

이런식으로 검사를 하면서 DP의 값을 업데이트해주고 가장 긴 값을 저장해서 출력해주면 된다.

 

정답코드

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	int n;

	cin >> n;

	vector<int> v(n);
	vector<int> dp(n,1);

	for (int i = 0; i < n; i++)
	{
		cin >> v[i];
	}

	int answer = 1;

	
	for (int i = 1; i < n; i++)
	{
		for (int j = 0; j < i; j++)
		{
			//기준값보다 작은게 몇개인지 센다.
			if (v[i] > v[j])
			{
				dp[i] = max(dp[i], dp[j] + 1);
			}
		}
		answer = max(answer, dp[i]);
	}

	cout << answer << "\n";

	return 0;
}

 

'코딩테스트 > 백준' 카테고리의 다른 글

[백준][C++]1786번. 찾기  (0) 2024.11.09
[백준][C++]2579번. 계단 오르기  (2) 2024.11.08
[백준][C++]1463번. 1로 만들기  (2) 2024.10.26
[백준][C++]1932번. 정수 삼각형  (1) 2024.10.25
[백준][C++]1149번. RGB거리  (1) 2024.10.25

+ Recent posts