문제풀이/백준oj
[백준OJ] 13302번 리조트
Hyeon-Uk
2021. 8. 3. 21:21
반응형
https://www.acmicpc.net/problem/13302
13302번: 리조트
수영이는 여름방학을 맞이하여 많은 놀이 시설이 있는 KOI 리조트에 놀러가려고 한다. 리조트의 하루 이용권의 가격은 만원이다. 하지만 리조트의 규모는 상상을 초월하여 모든 시설을 충분히
www.acmicpc.net
-풀이-
모든 경우를 탐색을 하며 문제를 풀었는데, DP를 이용하여 시간복잡도를 줄여주었다.
각 경우의 날마다, 하루이용권을 사용했을때, 3일권을 사용했을때, 5일권을 사용했을때중 가장 작은 값을 구해준다. 이때 쿠폰이 3장이상이라면, 쿠폰3장을 사용하여 하루권을 이용하는경우도 고려해주어야한다.
-코드-
#include <iostream>
#include<algorithm>
#include<cstring> //memset
#define MAX 987654321
using namespace std;
int dp[101][101] = { 0 };
bool close[101] = { 0 };
int price[3][3] = { {1,0,10000},{3,1,25000},{5,2,37000} };
int n, m;
int dfs(int day, int cp) {
if (day <= n) {
if (dp[day][cp] != MAX) {
return dp[day][cp];
}
if (close[day]) {
return dp[day][cp] = dfs(day + 1, cp);
}
for (int i = 0; i < 3; i++) {
dp[day][cp] = min(dp[day][cp], dfs(day + price[i][0], cp + price[i][1])+price[i][2]);
}
if (3 <= cp) {
dp[day][cp] = min(dp[day][cp], dfs(day + 1, cp - 3));
}
return dp[day][cp];
}
else {
return 0;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
memset(dp, MAX, sizeof(dp));
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= n; j++) {
dp[i][j] = MAX;
}
}
for (int i = 0; i < m; i++) {
int day;
cin >> day;
close[day] = true;
}
cout<<dfs(1, 0);
return 0;
}
반응형