문제 링크 :https://www.acmicpc.net/problem/11055

 

11055번: 가장 큰 증가 부분 수열

수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수열은 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 이고, 합은 113이다.

www.acmicpc.net

 문제 설명 

 

수열 이 주어지는데 그 수열에서 증가 부분 수열의 합중 최대값을 찾는 것 .

{1 100 2 3 4} : 증가 부분 수열 X     {1 2 3 5 7 50} : 증가 부분 수열 O

 

 알고리즘 

 

순서대로 진행하며 자기보다 낮은 인덱스를 조사. 

그중 자기보다 낮은수에 대해 증가 부분 수열 합을 구한다.

그래서 나오는 최댓값을 자기 인덱스 DP 에 대입 한다.

 

 

 코드  

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
30
31
32
33
34
35
36
37
#include<iostream>
#include<algorithm>
 
using namespace std;
 
int main() {
    int N;
    cin >> N;
    int arr[1001];
    int dp[1001];
    for (int i = 0; i < N; i++)cin >> arr[i];
 
    for (int i = 0; i < N; i++)dp[i] = 0;
 
    for (int i = 0; i < N; i++) {
        int num = 0;
        for (int j = i; j >= 0; j--) {
            
            if (arr[i] > arr[j]) {//자기보다 낮은 인덱스에서 낮은 값을 발견 했다 .
 
                num =max(num, arr[i] + dp[j]); //그중 최대값을 찾는 .
 
            }
            
            
        }
        dp[i] = num;
        if (dp[i] == 0)dp[i] = arr[i];// 자기 아래 인덱스에서 자기 보다 낮은숫자가 없으면 그냥 자기를 DP 배열에 넣음.
    }
    int result = 0;
 
    for (int i = 0; i < N; i++) {
        result = max(result, dp[i]);
    }
    cout << result;
 
}
cs
 

 

'c++ > 백준' 카테고리의 다른 글

백준 9095번 :R G B 거리  (0) 2020.04.06
백준 9095번 : 1,2,3 더하기  (0) 2020.04.06
백준 12865: 평범한 배낭  (0) 2020.04.03
백준 1987: 알파벳  (0) 2020.04.02
백준 1449: 수리공 항승  (0) 2020.04.02
ariz1623