정리와기록 블로그
[11055] 가장 큰 증가 부분 수열 본문
문제: 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
접근:
- 기존에는 가장 길이를 반환하는 형태의 재귀함수로 '가장 긴 증가하는 부분 수열'을 구했다면 이번에는 합을 반환하는 형태로 함수를 바꿔주면 된다.
코드:
#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
int N;
int A[1001];
int cache[1001];
// i에서 시작하는 증가수열 중 가장 큰 증가수열의 합을 반환한다
int getMax(int i)
{
int& ret = cache[i];
if (ret != -1) return ret;
// 아니면 계산한다
ret = A[i];
for (int j = i + 1; j <= N; j++)
{
if (A[i] < A[j])
{
ret = max(ret, A[i] + getMax(j));
}
}
return ret;
}
int main()
{
ios::sync_with_stdio(false);
memset(cache, -1, sizeof(cache));
cin >> N;
for (int i = 1; i <= N; i++) cin >> A[i];
cout << getMax(0);
return 0;
}
'BOJ > 동적계획법' 카테고리의 다른 글
[1890] 점프 (0) | 2020.04.04 |
---|---|
[10942] 팰린드롬? (0) | 2020.04.04 |
[14002] 가장 긴 증가하는 부분 수열 4 (0) | 2020.03.07 |
[9465] 스티커 (0) | 2020.03.07 |
[2193] 이친수 (0) | 2020.03.07 |
Comments