문제 링크입니다: https://www.acmicpc.net/problem/11722
http://jaimemin.tistory.com/317와 비슷한 문제였습니다.
/*
수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오.
*/
#include <iostream>
#include <cstring>
using namespace std;
const int MAX = 1000;
int N; //수열의 길이
int cache[MAX + 1], arr[MAX];
//arr[start]에서 시작하는 감소 부분 수열 중 최대 길이 반환
int LDS(int start) //Least Decreasing Sequence
{
int &result = cache[start + 1];
if (result != -1)
return result;
result = 0;
for(int next=start+1; next<N; next++)
if (start == -1 || arr[start] > arr[next]) //처음 index이거나 전보다 더 작을 경우에만
{
int candidate = LDS(next) + 1;
if (candidate > result)
result = candidate;
}
return result;
}
int main(void)
{
cin >> N;
if (N<1 || N>MAX)
exit(-1);
for (int i = 0; i < N; i++)
cin >> arr[i];
memset(cache, -1, sizeof(cache));
cout << LDS(-1) << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 프로그래밍 대회에서 배우는 알고리즘 문제해결전략
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1965번 상자넣기 (0) | 2018.02.26 |
---|---|
백준 2749번 피보나치 수 3 (0) | 2018.02.25 |
백준 11055번 가장 큰 증가 부분수열 (0) | 2018.02.22 |
백준 11048번 이동하기 (0) | 2018.02.22 |
백준 2747번 피보나치 수, 2748번 피보나치 수 2 (0) | 2018.02.22 |