Study hard

(c++)백준 11052번: 카드 구매하기 본문

백준/DP

(c++)백준 11052번: 카드 구매하기

Nimgnoej 2020. 6. 10. 20:50

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

 

11052번: 카드 구매하기

첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)

www.acmicpc.net

※점화식※

dp[i] : i개 카드 구매 위해 민규가 지불해야 하는 금액의 최댓값

dp[1] = P[1]

dp[x] = max(P[x], (dp[x-j][j]중 최댓값)) (1≤j≤x/2)

 

#include <iostream>
#include <algorithm>
using namespace std;

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

void DP() {
	dp[1] = P[1];
	for (int i = 2; i <= N; i++) {
		long long tmp = -1;
		for (int j = 1; j <= i / 2; j++) {
			tmp = max(tmp, dp[i - j] + dp[j]);
		}
		dp[i] = max(tmp, P[i]);
	}
	cout << dp[N] << endl;
}

int main() {
	cin >> N;
	for (int i = 1; i <= N; i++) {
		cin >> P[i];
	}
	DP();
	return 0;
}

'백준 > DP' 카테고리의 다른 글

(c++)백준 11060번: 점프 점프  (0) 2020.09.13
(c++)백준 11048번: 이동하기  (0) 2020.09.13
(c++)백준 2011번: 암호코드  (0) 2020.06.10
(c++)백준 2225번: 합분해  (0) 2020.06.10
(c++)백준 9461번: 파도반 수열  (0) 2020.06.10