본문 바로가기
알고리즘

가장 긴 증가하는 부분 수열4

by kcj3054 2021. 7. 28.

틀린 이유 : 가장 긴 시리즈3을 해결 후 4를 도전 했는데 어려웠다...
1. 처음에는 수열 값도 출력을 하라길래 매순간에 넣어두면 되지 않나 생각 했는데 아니다..

2. upperbound로 이용 해볼까 했는데 실패..

다른 블로그들을 참고 하면서 풀었다

 

풀이 :

점화식 정의 :

dp[a] =b -> a번째 값이 가지는 가장 긴 증가하는 부분 수열의 길이는 b이다.

vector lis[] -> list[a] = {...} => a번째 값이 가장 긴 증가하는 부분 수열은 벡터 원소들이다.

for (int i = 1; i <= n; ++i) {
		dp[i] = 1;
		lis[i].push_back(a[i]);

		for (int j = 1; j < n; ++j) {
			if (a[i] > a[j]) {
				
				//가장 긴 수열 길이 저장
				if (dp[i] < dp[j] + 1) {
					lis[i].clear();
					lis[i] = lis[j];
					
					//lis[j]까지 원소 넣고 현재 i번째 원소도 넣어야지 lis[i] -> i번째에서 가장 긴 수열원소는 벡터의 원소이다가 성립한다 
					lis[i].push_back(a[i]);
					dp[i] = dp[j] + 1;
				}
			}
		}
		if (answer.size() < lis[i].size()) {
			answer = lis[i];
		}

위와 같이 dp[i] < dp[j] + 1로 갱신 하면서 lis도 변경을 해주는 식이다 

마지막 answer 사이즈와 lis 사이즈를 비교하면서 크기가 크다 -> 길이가 길다 이므로 비교한다 

 

 

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

백준 9251 lcs  (0) 2021.08.09
백준 11066 파일합치기  (0) 2021.08.04
백준 가장 긴 증가하는 부분 수열 11053  (0) 2021.08.03
백준 12865 평범한 배낭  (0) 2021.08.03
백준22251 빌런 호석  (0) 2021.07.24