728x90

단계별로 풀어보기 동적 계획법 1의 11단계 문제

LIS(Longest Increasing Subsequence) 문제이다.

 

11053번: 가장 긴 증가하는 부분 수열

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

www.acmicpc.net

#include <iostream>
using namespace std;

int main() {
	int n;
	cin >> n;
	int* numbers = new int[n];
	int* dp = new int[n]; //i까지의 최장 증가하는 수열의 길이를 저장하는 배열
	for (int i = 0; i < n; i++) {
		cin >> numbers[i];
	}
	dp[0] = 0;
	for (int i = 0; i < n; i++) {
		int maxBeforeI = 0; //i 전까지 최장 증가하는 수열의 길이를 저장할 변수
		for (int j = 0; j < i; j++) { //i 전까지
			if (numbers[i] > numbers[j]) { //'증가하는' 조건을 만족하면서
				if (dp[j] > maxBeforeI) //더 긴 수열이 발견되면
					maxBeforeI = dp[j]; //업데이트
			}
		}
		dp[i] = maxBeforeI + 1; // i 전까지를 구했으니까 나 자신 i를 더해줘야 한다.
	}
	int maxDp = 0;
	for (int i = 0; i < n; i++) {
		if (dp[i] > maxDp)
			maxDp = dp[i];
	}
	cout << maxDp << endl;
	return 0;
}

동적 계획법의 특징 답게 특별한 계산 없이 해를 구할 수 있다.

나보다 작으면서 나보다 이전에 있는 LIS에 1만 더해주면 된다.

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 14501번 퇴사  (0) 2020.01.29
[백준] 1110번 더하기 사이클  (0) 2020.01.29
[백준] 6603번 로또  (0) 2020.01.29
[백준] 1181번 단어 정렬  (0) 2020.01.29
[백준] 11050번 이항계수 1  (0) 2020.01.28

+ Recent posts