[백준] 11055 가장 큰 증가 부분 수열 C++ (DP)

·2022년 3월 12일
0

백준

목록 보기
10/23
post-thumbnail


📌백준 11055 가장 큰 증가 부분 수열
https://www.acmicpc.net/problem/11055


11053 가장 긴 증가하는 부분수열을 풀어봤다면
수월하게 풀 수 있다.

탐색 순서는
i=3일 때 1, 2번째
i=4일 때 1, 2, 3번째와
비교한다.

입력받는 수를 담을 배열 arr[]와
i번째까지 증가하는 수열의 합을 담을 배열 dp[]를
정의해준다.

d[]의 모든 원소는 arr[] 자기자신 값으로 초기화해준다.
가장 긴 증가하는 수열이 자기자신 뿐으로 총 합이 자기자신일 수도 있다.

i=3일 때 j=1, 2
i=4일 때 j=1, 2, 3 이라고 하면

arr[i]가 arr[j]보다 작을 경우는 패쓰하고
arr[i]가 arr[j]보다 클 경우에는 d[i] = d[j] + arr[i]을 해준다.
여기서 주의할 점
arr[4]가 arr[2]보다 크고 arr[3]보다 큰데
d[2] = 1, d[3] = 100일 때 d[4]는 100이 되어야 한다.
그러면 매번 d[j]+arr[i]값을 비교했을 때 더 큰 값을 선택해주면 된다.
즉, d[i] = max(d[i], d[j]+arr[i])을 반복해주면 된다.


#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    int N;
    scanf("%d", &N);
    
    int arr[1001];
    for(int i=1; i<=N; i++) scanf("%d", &arr[i]);

    int dp[1001];
    for(int i = 1; i<=N; i++) dp[i] = arr[i];

    for(int i = 1; i<=N; i++)
    {
        for(int j = 1; j<i; j++)
        {
            if(arr[i] > arr[j])
            {
                dp[i] = max(dp[i], dp[j] + arr[i]);
            }
        }
    }
    sort(dp, dp+N+1);

    //for(int i=1; i<=N; i++) printf("%d  ",dp[i]);
    printf("%d",dp[N]);

}
profile
https://k-ang.tistory.com/ 이전했어요

0개의 댓글