백준문제풀이
백준 문제 11052번 카드 구매하기 문제풀이 c++
노가다 김씨
2022. 4. 10. 04:36
https://www.acmicpc.net/problem/11052
11052번: 카드 구매하기
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
문제해석
전형적인 dp문제인데
4
1 5 6 7
입력이 위 처럼 들어왔다고 가정해보자
카드 4장을 구매하는 경우는
1+1+1+1
1+1+5
1+6
7
5+5
이렇게 5가지가 존재하고 이 중 5+5가 가장 큰 값이 되므로 이것이 답이된다.
위의 5가지 경우를 식으로 나타내면
dp[4]=max({dp[3]+p[1],dp[2]+p[2],dp[1]+p[3],dp[0]+p[4]})가 되고 점화식을 일반화 하면
j의 범위 1<=j<=i에 대해서 dp[i]=max(dp[i],dp[i-j]+p[j]) 임을 찾을 수있고 코드로 작성하면 다음과 같다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int dp[1001];
int p[1001];
int main(){
cout.tie(NULL);
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int n; cin>>n;
for(int i=1; i<=n; i++)
{
cin>>p[i];
}
for(int i=1; i<=n; i++)
{
int mx=0;
for(int j=1; j<=i; j++)
{
mx=max(mx,dp[i-j]+p[j]);
}
dp[i]=mx;
}
cout<<dp[n];
}