Search
Duplicate
📒

카드 구매하기

주차
11주차
문제번호
11052
언어
티어
실버
유형
DP
nj_Blog
nj_상태
이해도
66%
풀이
사람
이해도 2
13 more properties

문제접근

dp[n]은 n개의 카드를 구매하는데 지불해야 하는 금액의 최대값
p[n] n개가 들어있는 카드팩의 금액
점화식 유도
4개의 카드를 구매하는 방법
1.
3개의 카드를 구매하는데 지불해야 하는 금액의 최대값 + 1개가 들어있는 카드팩의 금액
→ dp[3] + p[1]
2.
2개의 카드를 구매하는데 지불해야 하는 금액의 최대값 + 2개가 들어있는 카드팩의 금액
→ dp[2] + p[2]
3.
1개의 카드를 구매하는데 지불해야 하는 금액의 최대값 + 3개가 들어있는 카드팩의 금액
→ dp[1] + p[3]
4.
4개가 들어있는 카드팩의 금액
→ dp[0] + p[4]
이 중에서 최대를 구하면 됨
dp[ni]+p[i]dp[n-i] + p[i]
//pseudo code cin >> n; while // n까지 while // i까지 dp[n-i] + p[i] 중에서 최대값
C++
복사

놓쳤던 부분

코드

2016 KB

0 ms

#include <iostream> #include <vector> #include <algorithm> int n; std::vector<int> dp; std::vector<int> p; void input_setting() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); } void input() { int i; i = 0; std::cin >> n; dp.resize(n + 1, 0); p.resize(n + 1); while (++i <= n) std::cin >> p[i]; } void solution() { int i = 0; while (++i <= n) { int j = 0; while (++j <= i) dp[i] = std::max(dp[i], dp[i - j] + p[j]); } std::cout << dp[n]; } int main(void) { input_setting(); input(); solution(); return (0); }
C++
복사