정리와기록 블로그

[11055] 가장 큰 증가 부분 수열 본문

BOJ/동적계획법

[11055] 가장 큰 증가 부분 수열

뫂림 2020. 3. 7. 15:31

문제: 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