문제
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10,20, 10,30, 20,50} 이고, 길이는 4이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai≤ 1,000)
출력
첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
구현
10 20 10 30 20 50
max 1 2 2 3 3 4
dp[i] 1 2 1 3 2 4
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#define _CRT_SECURE_NO_WARNINGS
int compare(int a, int b) {
return (a > b) ? a : b;
}
int main(void) {
int num, i, j, result=0, max=0;
int arr[1001] = { 0 };
int dp[1001] = { 0 };
scanf("%d", &num);
for (i = 1; i <= num; i++) {
scanf("%d", &arr[i]);
}
for (i = 1; i <= num; i++) {
max = 0; //최종 출력할 수열의 길이 0으로 초기화
for (j = 0; j < i; j++) { //j가 i까지 탐색하면서
if (arr[i] > arr[j]) { //j가 현재 i보다 작은 값만 탐색
if (dp[j] > max) { // 전의 dp값이 현재 최대값은 max보다 크다면
max = dp[j]; //max에 dp값 저장
}
}
}
dp[i] = max + 1; // i는 자신보다 작은 값만 탐색했으므로 +1 해준다.
result = compare(result, dp[i]);
}
printf("%d",result);
}
'Algorithm > DP' 카테고리의 다른 글
2565번 전깃줄 BOJ 백준 C언어 (0) | 2020.08.25 |
---|---|
11054번 가장 긴 바이토닉 부분 수열 BOJ 백준 C언어 (0) | 2020.08.24 |
2156번 포도주 시식 BOJ 백준 C언어 (0) | 2020.08.07 |
10844번 쉬운 계단 수 BOJ 백준 C언어 (0) | 2020.08.07 |
1463번 1로 만들기 BOJ 백준 C언어 (0) | 2020.08.06 |
댓글