04-29 22:50
Recent Posts
Recent Comments
관리 메뉴

너와나의 관심사

DP 문제 풀이 접근 본문

카테고리 없음

DP 문제 풀이 접근

벤치마킹 2018. 4. 15. 13:54



백준 문제중에서 https://www.acmicpc.net/problem/11722

가장 긴 감수 수열의 부분 수열의 길이를 찾는 문제


접근 법은 A[0] 와 A[1] 이 조건을 만족 한다면 

A[0] 에서 바라본 A[1] 의 가장  간 감소 수열의 부분 집합의 길이에서 +1 씩 해주는 재귀로 접근한다.


또한 return 값은 항상 옳다는 믿음이 중요하다.

예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10}



 


#include <stdio.h>

#include <iostream> 

#include <vector>

#include <string>

#include <queue>

#include <functional>

#include<algorithm>

#include <cstring>



using namespace std;


#define MAX(a,b) a>b ? a:b

#define MIN(a,b) a>b ? b:a

#define ABS(a) a>0 ? a:-a


int N;

int arr[1001];

vector<int> v;


int dp(int idx){


int min_len = -1;

if (arr[idx] != -1) return arr[idx];


for (int i = idx + 1; i <= N; i++){

if (v[i] < v[idx])

arr[idx]  =  min_len  = MAX(min_len, dp(i));

}


if (min_len == -1) return 0;


else

return arr[idx] = min_len + 1;

}

int main(void) {

memset(arr, -1, sizeof(arr));

setbuf(stdout, NULL);

freopen("input3.txt", "r", stdin);


cin >>  N;

v.push_back(1001);



for (int i = 0; i <N ; i++){

int a;

cin >> a;

v.push_back(a);

}


cout << dp(0)  << endl;


return 0;

}


Comments