끄적끄적 코딩
article thumbnail
728x90

 

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

 

수열 A에서 가장 길게 증가하는 수열을 구하는 문제입니다.

1. 차례대로 검색

2. 전에 수열이 현재 수열보다 길면서 && 전의 값이 현재값보다 작으면 

3. 현재수열에 전 수열의 길이 +1을 DP에 저장

 

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

 

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

int maxNum = -987654321;
int num[1010];
int memo[1010];

void init()
{
   for (int i = 0; i < 1010; ++i) {
      num[i] = 0;
      memo[i] = 1;
   }
}

int main(int argc, char *argv[])
{
   init();
   int n;
   cin >> n;
   for (int i = 0; i < n; ++i) {
      cin >> num[i];
   }
   for (int i = 1; i < n; ++i) {
      for (int j = i - 1; j >= 0; --j) {
         if (memo[i] <= memo[j] && num[i] > num[j]) {
            memo[i] = memo[j] + 1;
         }
      }
   }
   for (int i = 0; i < n; ++i) {
      maxNum = max(maxNum, memo[i]);
   }
   cout << maxNum;

   return 0;
}

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

[C++] 백준 2293번 동전1  (0) 2019.05.22
[C++] 백준 11052번 카드 구매하기  (0) 2019.05.22
[C++] 백준 2577번 숫자의 개수  (0) 2019.05.19
[C++] 백준 1978번 소수 찾기  (0) 2019.05.19
[C++] 백준 11727번 2xn 타일링2  (0) 2019.05.18

검색 태그