문제
https://www.acmicpc.net/problem/16194
16194번: 카드 구매하기 2
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
풀이
처음에 DP 테이블을 P(i)를 활용해서 초기화 해주었다.
이후 점화식을 세워주었다.
최솟값(dp[i]) = 비용의 최솟값을 구해야하므로 기존에 i장을 구매하기위해 필요한 비용(dp[i])과 i - j장을 구매하기위해 필요한 비용 + j장을 구매하기위해 필요한 비용(dp[i - j] + arr[j]) 중 최솟값이라는 점화식을 도출해낼 수 있었고 이를통해 문제를 해결할 수 있었다.
코드
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int dp[1001];
int arr[1001];
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> arr[i];
dp[i] = arr[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
dp[i] = min(dp[i], dp[i - j] + arr[j]);
}
}
cout << dp[n];
}
'BOJ' 카테고리의 다른 글
[BOJ] 백준 6593번 상범 빌딩 C++ (0) | 2022.05.18 |
---|---|
[BOJ] 백준 23352번 방탈출 C++ (제1회 한국항공대학교 프로그래밍 경진대회 문제) (0) | 2022.05.18 |
[BOJ] 백준 16938번 캠프 준비 C++ (0) | 2022.04.07 |
[BOJ] 백준 2146번 다리 만들기 C++ (0) | 2022.04.06 |
[BOJ] 백준 1987번 알파벳 C++ (0) | 2022.04.05 |