문제출처: https://www.acmicpc.net/problem/11055


풀이

약 3주만에 알고리즘 문제를 다시 풀어보려는데 감이 많이 떨어져서 쉬운 문제를 찾다가 풀어본 문제입니다.

대충 문제를 읽고 dp문제같아서 dp로 풀었는데 맞았습니다. 

arr[i]>arr[j]일 때 ( 앞의값보다 뒤의값이 클 때) dp[i]값을 갱신하는 식만 작성할줄 알면 될 것 같습니다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
#include<algorithm>
int arr[1001], dp[1001];
using namespace std;
int main()
{
    int n, sum = 0;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
        //arr[i]값을 dp에 복사한다.
        dp[i] = arr[i];
        //하나씩 비교해보며 가장 큰 증가부분수열구함
        for (int j = 0; j <= i; j++)
        {
            // [1, 100, 2] 일 때
            //증가수열이므로 무조건 뒷값이 앞값보다커야함
            if (arr[i] > arr[j])
            {
                //정답인dp[i]값을 갱신시켜나감
                if (dp[i] < dp[j] + arr[i])dp[i] = dp[j] + arr[i];
            }
        }
        //정답을 갱신시킴
        sum = max(sum, dp[i]);
    }
    cout << sum << endl;
}
cs


결과




'문제풀이(BOJ) > 다이나믹 프로그래밍' 카테고리의 다른 글

[백준 16395] 파스칼의 삼각형  (0) 2020.03.10
[백준 1309] 동물원  (0) 2020.01.09
[백준 1010] 다리 놓기  (0) 2019.12.11
[백준 11052] 카드 구매하기  (0) 2019.12.11
[백준 1912] 연속합  (0) 2019.12.08

+ Recent posts