끄적끄적 코딩
728x90

다이나믹 프로그래밍 문제입니다.

증가하는 수열의 값을 체크해서 DP에 넣고
감소하는 수열의 값을 체크해서 DP에 추가로 넣어서 문제를 풀었습니다.

증가하는 수열은 다음처럼 구했습니다.
for (int i = 1; i <= n; ++i) {
    for (int j = i; j > 0; --j) {
        if (seq[j] < seq[i] && DP[j] >= DP[i]){
            DP[i] = DP[j] + 1;
        }
    }
}
seq는 수열의 값입니다.
for문을 반복하면서 이전 값들을 비교해서
현재값보다 작으면서 DP값이 같거나 크면
현재 DP에 작은 DP값 +1해서 넣어줍니다.

감소하는 수열은 현재값보다 크면으로만 바꿔주면 됩니다.

#include <iostream>
#include <algorithm>
using namespace std;

int main(int argc, char *argv[])
{
	int n;
	int mNum = 0;
	int seq[1010];
	int DP[1010] = { 1, };

	for (int i = 0; i < 1010; ++i) {
		seq[i] = 0;
		DP[i] = 1;
	}

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

	for (int i = 1; i <= n; ++i) {
		for (int j = i; j > 0; --j) {
			if (seq[j] < seq[i] && DP[j] >= DP[i]){
				DP[i] = DP[j] + 1;
			}
		}
	}

	for (int i = 1; i <= n; ++i) {
		for (int j = i; j > 0; --j) {
			if (seq[j] > seq[i] && DP[j] >= DP[i]) {
				DP[i] = DP[j] + 1;
			}
		}
	}

	for (int i = 1; i <= n; ++i) {
		mNum = max(mNum, DP[i]);
	}
	
	cout << mNum << endl;

	return 0;
}

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

[C++] 백준 2096번 내려가기  (0) 2019.07.04
[C++] 백준 1915번 가장 큰 정사각형  (0) 2019.06.23
[C++] 백준 2225번 합분해  (0) 2019.06.05
[C++] 백준 1520번 내리막 길  (0) 2019.06.04
[C++] 백준 1890번 점프  (0) 2019.05.31

검색 태그