알고리즘

[C++] 백준 11053번 가장 긴 증가하는 부분 수열

J3SUNG 2019. 5. 22. 01:46
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;
}