11055번: 가장 큰 증가 부분 수열
수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수�
www.acmicpc.net
변형된 LIS문제였다.
필자는 길이가 i인 수열에서 i번째 원소를 반드시 포함할 때 갖는 최대값을 memo[i]에 저장하였다.
수열의 길이 N을 입력받았다면 1~N까지 위 작업을 진행한 다음 memo[1]~memo[N]에서 가장 큰 값을 찾아주면 원하는 정답을 얻을 수 있다.
#include <iostream>
using namespace std;
int arr[1001], memo[1001];
int max(int a, int b) { return a > b ? a : b; }
int Topdown(int N)
{
if (N == 0) return arr[N];
int& ret = memo[N];
if (ret != 0) return ret;
ret = arr[N];
for (int i = 0; i < N; i++)
if (arr[i] < arr[N])
ret = max(ret, Topdown(i) + arr[N]);
return ret;
}
int Bottomup(int N)
{
int ret = 0;
for (int i = 0; i < N; i++)
{
memo[i] = arr[i];
for (int j = 0; j < i; j++)
if (arr[i] > arr[j])
memo[i] = max(memo[i], memo[j] + arr[i]);
ret = max(ret, memo[i]);
}
return ret;
}
int main(void)
{
int N;
cin >> N;
for (int i = 0; i < N; i++)
cin >> arr[i];
//top-down
int res = 0;
for(int i=0; i<N; i++)
res = max(res, Topdown(i));
cout << res << endl;
//bottom-up
cout << Bottomup(N) << endl;
return 0;
}

알고리즘 200일 프로젝트 - 79 day
'알고리즘 > BOJ' 카테고리의 다른 글
백준 2167번: 2차원 배열의 합 (0) | 2020.06.25 |
---|---|
백준 9251번: LCS (0) | 2020.06.23 |
백준 1699번: 제곱수의 합 (0) | 2020.06.20 |
백준 2293번: 동전 1 (0) | 2020.06.20 |
백준 11057번: 오르막 수 (0) | 2020.06.18 |