Study hard

(c++)백준 11055번: 가장 큰 증가 부분 수열 본문

백준/DP

(c++)백준 11055번: 가장 큰 증가 부분 수열

Nimgnoej 2020. 6. 9. 16:41

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

 

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

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

www.acmicpc.net

이 문제는 앞에서부터 dp배열을 채웠다.

가장 긴 증가하는 수열문제와 비슷하게 현재 인덱스보다 앞부분을 보면서 값이 더 작고 dp가 제일 큰 것을 저장한 후, 현재 dp에 더하면 된다.

2020/06/09 - [백준/DP] - (c++)백준 11053번: 가장 긴 증가하는 부분 수열

#include <iostream>
using namespace std;

int N;
int A[1001];
long long dp[1001];

void DP() {
	long long Max = -1;

	//앞에서부터
	for (int i = 2; i <= N; i++) {
		int maxSum = 0;
		for (int j = i - 1; j >= 1; j--) {
			if (A[i] > A[j] && dp[j] > maxSum)
				maxSum = dp[j];
		}
		dp[i] += maxSum;
	}

	for (int i = 1; i <= N; i++) {
		if (Max < dp[i])
			Max = dp[i];
	}

	cout << Max << endl;
}

int main() {
	cin >> N;
	for (int i = 1; i <= N; i++) {
		cin >> A[i];
		dp[i] = A[i];//dp도 같이 초기화
	}
	DP();
	return 0;
}