Problem Solving/백준 1일 1커밋

백준 9177 가장 큰 증가 부분 수열 - C++

HWAN JJ 2022. 1. 20. 16:26

https://www.acmicpc.net/problem/11055

 

11055번: 가장 큰 증가 부분 수열

수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수

www.acmicpc.net

신촌 알고리즘 초급 3주차 문제.

 

DP 중 굉장히 유명한 문제로, 하나의 수열이 주어졌을 때, 그 수열의 부분 수열 중 증가 부분 수열의 성질을 만족하고,

내부 원소들의 합이 가장 큰 수열의 합을 출력한다.

 

DP[x]를 x번째 원소를 가장 큰 원소로 가지는 증가 부분 수열 중 가장 큰 원소합이라고 하면

 

DP[i] (i<x) 를 통해서 DP[x]를 유추할 수 있다. 

만약 A[i] < A[x] 이면, DP[i]에서 구한 증가 부분 수열에 A[x]를 추가해도 부분 수열을 만족하고,

더 큰 원소합을 가질 수 있게 된다. 

 

#define _CRT_SECURE_NO_WARNINGS

#include <cstdio>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <memory.h>


using namespace std;
using ll = long long;

ll input[1010], dp[1010] = { 0, };

int main(void) {

	int n;
	
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%lld", &input[i]);

	// dp[x]는 x번째 원소를 포함하는 가장 큰 부분 수열의 합
	dp[0] = input[0];
	for (int i = 1; i < n; i++) {
		dp[i] = input[i];
		for (int j = 0; j < i; j++) {
			// dp[j] : j번째 원소를 포함하는 가장 큰 부분 수열의 합과 비교해서 업데이트
			if (dp[i] > dp[j])
				dp[i] = max(dp[i], dp[j] + input[i]);
		}
	}

	ll result = 0;

	for (int i = 0; i < n; i++)
		result = max(result, dp[i]);

	printf("%lld", result);

	return 0;
}