https://www.acmicpc.net/problem/11053
11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
www.acmicpc.net
[문제 풀이]
다이나믹 프로그래밍을 이용하여 문제를 풀었습니다.
이 문제는 증가하는 부분 수열 중에 가장 긴 부분 수열을 찾는 문제입니다. 부분 수열을 찾기 위해 DP 배열을 선언하여 메모제이션 해주었습니다. 2중 반복문을 돌면서 0번째 인덱스부터 i번째 인덱스까지 반복하면서 자신보다 값이 작은 경우가 있다면
dp[i] = max(dp[i], dp[j] + 1)
을 이용하여 메모제이션 해주었습니다.
[코드]
#include<iostream>
#include<algorithm>
using namespace std;
int N;
int result = 0;
int A[1001];
int dp[1001];
int main() {
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%d", &A[i]);
for (int i = 0; i < N; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (A[i] > A[j]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
result = max(result, dp[i]);
}
printf("%d\n", result);
return 0;
}
'algorithm > BOJ' 카테고리의 다른 글
백준 12865_평범한 배낭(C++) (0) | 2020.05.27 |
---|---|
백준 14500_테트로미노(C++) (2) | 2020.04.29 |
백준 14502_연구소(C++) (0) | 2020.04.28 |
백준 16236_아기 상어(C++) (0) | 2020.04.24 |
백준 15684_사다리 조작(C++) (0) | 2020.04.23 |