문제 링크입니다 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
'11053번 가장 긴 증가하는 부분 수열' 문제(https://seokeeee.tistory.com/61)와 유사한 문제였습니다. "dp[N] : 크기가 N인 수열에서 가장 큰 증가하는 부분 수열의 합"이라고 정의하고 문제를 해결했습니다. 위 링크 참조해주세요!
[소스코드]
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
|
#include<cstdio>
int n, num[1000], dp[1000];
int main(void) {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &num[i]);
// dp[0]부터 dp[n-1]까지의 값을 결정합니다
for (int i = 0; i < n; i++) {
dp[i] = num[i]; // 자기 자신이 가장 큰 증가 부분 수열
// 현재 칸보다 왼쪽에 있는 모든 칸에 대해
for (int j = 0; j < i; j++) {
// 현재 칸보다 왼쪽에 있는 칸의 수가 더 작고, 결정한 dp[i]값이
// j번째 칸 까지의 가장 큰 증가 부분 수열 + 현재 칸 보다 작다면
// 현재 칸의 값을 j번째 칸 까지의 가장 큰 증가 부분 수열 + 현재 칸으로 update
if (num[j] < num[i] && dp[i] < dp[j] + num[i]) {
dp[i] = dp[j] + num[i];
}
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
if (ans < dp[i]) ans = dp[i];
}
printf("%d", ans);
return 0;
}
|
cs |

'알고리즘 > BaekJoon' 카테고리의 다른 글
백준 1912 : 연속합 (0) | 2020.03.01 |
---|---|
백준 11722 : 가장 긴 감소하는 부분 수열 (0) | 2020.03.01 |
백준 14002 : 가장 긴 증가하는 부분 수열 4 (0) | 2020.02.29 |
백준 2529 : 부등호 (0) | 2020.02.29 |
백준 6064 : 카잉 달력 (0) | 2020.02.29 |