
input | output |
6 10 20 10 30 20 50 |
4 |
해당 문제는 동적 계획법을 사용하여 문제를 해결 하였다. 입력된 배열을 탐색하는 과정에서 자기 자신보다 작은 값을 찾는 경우에 해당 인덱스를 저장하고 dp 배열에 저장하였다. 수열의 길이는 dp 배열에서 가장 최댓값을 가지는 수의 인덱스이므로 가장 큰 값을 업데이트 해주면 문제 해결이 가능하다.
전체 소스 코드는 아래와 같다.
#include <stdio.h>
#pragma warning(disable:4996)
int main() {
int arr[1001];
int dp[1001] = {0,}; // Dynamic Programming Array
int max = 0;
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &arr[i]);
for (int i = 0; i < n; i++) { // 동적 계획법 사용
int min = 0;
for (int j = 0; j < i; j++) {
if (arr[i] > arr[j]) // 최솟값을 가지는 인덱스 찾기
if (min < dp[j])
min = dp[j];
}
dp[i] = min + 1; // dp 배열에 인덱스 저장
if (max < dp[i]) // 최댓값 = 수열의 길이
max = dp[i];
}
printf("%d", max);
return 0;
}
[11053번]
https://www.acmicpc.net/problem/11053
11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이
www.acmicpc.net
[github]
https://github.com/MinWook6457
MinWook6457 - Overview
MinWook6457 has 18 repositories available. Follow their code on GitHub.
github.com
'알고리즘' 카테고리의 다른 글
[경시대회] 소믈리에 구름이 (0) | 2024.05.08 |
---|---|
[백준] 1300번 - K번째 수 (C언어) [Gold2] (0) | 2023.06.06 |
[백준] 1517번 - 버블 소트 (C언어) [Platinum5] (0) | 2023.06.01 |
[백준] 2042번 - 구간 합 구하기 (C언어) [Gold1] (0) | 2023.05.31 |
[백준] 1918번 - 후위 표기식 (C언어) [Gold2] (0) | 2023.05.30 |