반응형
문제 링크: https://www.acmicpc.net/problem/11055
11055번: 가장 큰 증가하는 부분 수열
수열 A가 주어졌을 때, 그 수열의 증가하는 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가하는
www.acmicpc.net
<문제 풀이> 다이나믹 프로그래밍(DP) 알고리즘
기본적인 LIS 알고리즘을 구현하면 되는 문제입니다.
dp는 아래와 같이 정의할 수 있습니다.
dp[i] : i 번째까지의 원소를 고려했을 때 가장 큰 증가하는 부분 수열 중에서 합이 가장 큰 것
dp[i]를 갱신하는 방법은 1부터 i -1까지의 dp[j]에 각각에 대해 i 번째 원소를 포함했을 때 그 합이 가장 큰 것으로 갱신해 주면 됩니다.
dp[1] + seq[i] : 1 번째까지의 원소를 고려했을 때 가장 큰 증가하는 부분 수열 중에서 합이 가장 큰 것 + i 번째 원소의 값
dp[2] + seq[i]: 2 번째까지의 원소를 고려했을 때 가장 큰 증가하는 부분 수열 중에서 합이 가장 큰 것 + i 번째 원소의 값
.
.
dp[j] + seq[i] : j 번째까지의 원소를 고려했을 때 가장 큰 증가하는 부분 수열 중에서 합이 가장 큰 것
.
.
dp[i - 1] + seq[i] : i -1 번째까지의 원소를 고려했을 때 가장 큰 증가하는 부분 수열 중에서 합이 가장 큰 것
for (int i = 1; i <= n; i++) {
dp[i] = seq[i]; // 처음에는 자기 자신만 고려
for (int j = 1; j < i; j++) {
if (seq[i] <= seq[j]) continue;
dp[i] = max(dp[i], dp[j] + seq[i]);
}
}
<C++소스코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int dp[1001];
int seq[1001];
int main() {
ios_base::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> seq[i];
}
for (int i = 1; i <= n; i++) {
dp[i] = seq[i]; // 처음에는 자기 자신만 고려
for (int j = 1; j < i; j++) {
if (seq[i] <= seq[j]) continue;
dp[i] = max(dp[i], dp[j] + seq[i]);
}
}
cout << *max_element(dp, dp + n + 1);
return 0;
}
|
cs |
반응형
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 1758번] 알바생 강호 (0) | 2023.04.19 |
---|---|
[백준 13305번] 주유소 (0) | 2023.04.19 |
[백준 14916번] 거스름돈 (0) | 2023.04.12 |
[백준 9465번] 스티커 (2) | 2023.04.12 |
[백준 17626번] Four Squares (0) | 2023.04.12 |