백준/DP

[백준 11722번 / C++] 가장 긴 감소하는 부분 수열

배발자 2022. 3. 15.
반응형

dp 배열을 활용해서 풀면된다. 

 

#접근방법 

 

본인은 증가수열이 매우 익숙해서 reverse 함수를 통해서 벡터의 순서를 바꿔주고 

LIS(최장증가수열)를 통해 문제를 풀었다. 

 

dp 배열 1로 초기화, v 배열 데이터값 저장. 

  1. v 배열 인덱스 1부터 n-1까지 돌면서 dp를 확인한다. 
  2. 인덱스 i에 위치한 v 벡터의 데이터값과 인덱스값이 j (for (j< i))인 데이터값과 비교한다. 
  3. 인덱스 i에 위치한 데이터값이 인덱스 j에 위치한 데이터값보다 클 경우 dp[j]+1의 값과 dp[i] 값을 비교해서 큰 값으로 갱신해간다. 
  4. 이후 dp에 세팅된 값중 가장 큰값을 정답으로 출력한다.  
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	int n; cin >> n;
	vector<int> v;
	for (int i = 0; i < n; i++) {
		int a; cin >> a;
		v.push_back(a);
	}
	reverse(v.begin(), v.end());
	vector <int> dp(n, 1);
	int max_n = 1;
	for (int i = 1; i < n; i++) {
		for (int j = i - 1; j >= 0; j--) {
			if (v[i] > v[j]) {
				dp[i] = max(dp[j] + 1, dp[i]);
				
			}
		}
		max_n = max(dp[i], max_n);
	}
	cout << max_n;
}

 

 

11722번: 가장 긴 감소하는 부분 수열

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

www.acmicpc.net

반응형

'백준 > DP' 카테고리의 다른 글

[백준 2688번 / C++] 줄어들지 않아  (0) 2022.04.14
[백준 15486번 / C++] 퇴사 2  (0) 2022.03.16
[백준 11057 / C++] 오르막 수  (0) 2022.03.10
[백준 4811번 / C++] 알약  (0) 2022.03.08
[백준 16194 / C++] 카드 구매하기 2  (0) 2022.03.08

댓글