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
문제
수열 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의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> arr(1001);//전체수열을 담을 vector
vector<int> dp(1001,1);//부분수열의 최대 길이를 담을 vector 크기는 모두 1로 초기화
int N;
cin >> N;
for (int i = 1; i <= N; i++)
{
cin >> arr[i];
}
dp[1] = 1;//1개의 수열의 최대 길이는 1
for (int i = 2; i <= N; i++)
{
for (int j = 1; j < i; j++)
{
if (arr[j] < arr[i])
{
dp[i] = max(dp[j] + 1, dp[i]);//모든 dp값을 비교하며 최대값 저장
}
}
}
int result = 1;
for (int i = 1; i <=N; i++)
{
result = max(result, dp[i]);//1부터 N까지 중 증가집합의 길이가 가장 긴 길이를 출력
}
cout << result;
}
dp[n]은 n이 부분 수열의 최대값일 때 부분수열의 길이 값이다.
수열이 {1, 3, 2} 다음과 같을 때
dp[1] = 1
arr[2](=3) > arr[1](=2) 이므로
dp[2] = max(dp[1]+1, dp[2]) = max(2,1) = 2
arr[3](=2) > arr[1](=1) 이므로
dp[3] = max(dp[1]+1, dp[3]) = max(2,1) = 2
arr[3](=2) > arr[2](=3) 를 만족하지 못하므로
dp[3]은 그대로 2
for문을 돌려 부분집합 중 가장 큰 dp값을 result에 저장하고 출력한다.
다음과 같이 dp[4] 가 dp[7]보다 더 큰 경우가 있기 때문이다
'백준 c++ > (1-1)백준 c++ 알고리즘 기초' 카테고리의 다른 글
백준 1912 c++ 연속합 (0) | 2022.07.20 |
---|---|
백준 14002 c++ 가장 긴 증가하는 부분 수열 4 (0) | 2022.07.20 |
백준 1463 c++ 1로 만들기 (0) | 2022.07.19 |
백준 2193 c++ 이친수 (0) | 2022.07.19 |
백준 10844 c++ 쉬운 계단 수 (0) | 2022.07.19 |