백준 11052 카드구매하기
문제
문제링크 : https://www.acmicpc.net/problem/11052
풀이전략
- 최대한 돈을 많이 사용하도록 풀어야한다.
- 작은 값부터 순차대로 모든 경우의 수를 확인하여 문제를 해결한다. 단 이때 메모이제이션을 하여 시간복잡도를 낮춘다.
코드
#include<bits/stdc++.h>
using namespace std;
#define mine
vector<int> p(1001);
int dp[1001];
int main(){
int n;
cin >> n;
for(int i=1; i<=n; i++){
cin >> p[i];
}
for(int i=1; i<=n; i++){
// dp[1] 부터 순서대로 값을 계산하게 된다.
// dp[i-j] + p[j] 의 최대값이 곧 dp[i]의 값이 된다.
for(int j=1; j<=i; j++){
dp[i] = max(dp[i], dp[i-j]+p[j]);
}
}
cout << dp[n];
return 0;
}
소감
내가 해결하지 못하여 다른사람의 블로그를 참고하였다. 하지만 핵심은 하나다. 이 문제에서 N개의 카드가 주어지는데, 이러한 카드가 주어질 때 이 카드들 만으로 계산을 순차적으로 하면 된다. 이러한 테크닉을 배우게 되었다.
dp[i] = max(dp[i], dp[i-j]+p[j]) 이러한 방법을 잊지말자.
Author And Source
이 문제에 관하여(백준 11052 카드구매하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gomster_96/백준-11052-카드구매하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)