-
반응형
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; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 6118번 숨바꼭질 (0) 2021.08.04 [백준OJ] 1305번 광고 (0) 2021.08.04 [백준OJ] 15961번 회전 초밥 (0) 2021.08.02 [백준OJ] 12978번 스크루지 민호 2 (0) 2021.08.01 [백준OJ] 13305번 주유소 (0) 2021.07.31 댓글