BOJ 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이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
출력
첫째 줄에 수열 A의 합이 가장 큰 증가 부분 수열의 합을 출력한다.
재정의와 추상화
동적계획법(DP)로 문제를 풀 수 있다.
dp[i] = dp[k] + arr[i]
- dp[i] : i번째 인덱스까지의 원소에 대한 가장 큰 증가 부분 수열
- dp[k] : (0 <= k < i)의 범위에 대하여 k번째 인덱스까지의 원소에 대한 가장 큰 증가 부분 수열
- arr[i] : i번째 원소의 값
코드 작성
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
cin.sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int arr[1000];
int dp[1000] = { 0, };
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> arr[i];
for (int i = 0; i < n; i++) {
dp[i] = arr[i];
for (int k = i - 1; k >= 0; k--) {
if (arr[k] < arr[i] && dp[i] < dp[k] + arr[i])
dp[i] = dp[k] + arr[i];
}
}
cout << *max_element(dp, dp + n);
return 0;
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
BOJ 6010 - Music Notes 문제풀이 (0) | 2020.04.02 |
---|---|
BOJ 1920 - 수 찾기 문제풀이 (0) | 2020.04.01 |
BOJ 11048 - 이동하기 문제풀이 (0) | 2020.04.01 |
BOJ 11052 - 카드 구매하기 문제풀이 (0) | 2020.04.01 |
BOJ 11057 - 오르막 수 문제풀이 (0) | 2020.03.31 |
댓글
이 글 공유하기
다른 글
-
BOJ 6010 - Music Notes 문제풀이
BOJ 6010 - Music Notes 문제풀이
2020.04.02 -
BOJ 1920 - 수 찾기 문제풀이
BOJ 1920 - 수 찾기 문제풀이
2020.04.01 -
BOJ 11048 - 이동하기 문제풀이
BOJ 11048 - 이동하기 문제풀이
2020.04.01 -
BOJ 11052 - 카드 구매하기 문제풀이
BOJ 11052 - 카드 구매하기 문제풀이
2020.04.01