Algorithm
[BOJ] 가장 긴 증가하는 부분 수열 11053번 C++
따봉치치
2025. 1. 13. 14:59
728x90
문제
수열 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의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
접근 방식
아주 유명한 DP 문제이다
dp 배열을 생성하는데 dp[i]를 i번째 요소를 마지막으로 하는 증가하는 부분 수열의 최대 길이로 정의한다
즉, dp 배열을 모두 1로 초기화 한다음
이중 반복문을 통해
i를 1부터 끝까지 순회하고
내부 반복문으로 j를 1부터 i-1까지 순회하면서 현재 요소인 A[i]보다 A[j]가 작다면 d[i]와 dp[j]+1 중 최대값을 선택하면 된다
코드
#include<bits/stdc++.h>
using namespace std;
int main() {
int N; cin>>N;
vector<int> A(N+1);
for(int i=1; i<=N; i++) cin>>A[i];
int dp[1001];
for(int i=1; i<=N; i++){
dp[i] = 1;
for(int j=i-1; j>=1; j--) {
if(A[i] > A[j]) dp[i] = max(dp[i], dp[j]+1);
}
}
cout<<*max_element(dp+1, dp+N+1);
}
728x90