본문 바로가기
온라인저지

[BOJ] 13302번: 리조트

by plzfday 2018. 5. 20.

13302번: 리조트

풀이

dp[i][j] = j개의 쿠폰을 가지고 i일까지 있는데 드는 최소 비용.
 
처음에 쿠폰이 거슬렸는데 dp 배열을 2차원으로 두고 하니깐 한결 쉬워졌다. 재귀로 짰는데 for문으로도 짜보고 싶지만 잘 모르겠다.

코드

처음으로 3항 연산자의 감사함과 왜 있어야 하는가에 대해 진심으로 깨닫게 되었다...
#include <cstdio>
#include <algorithm>
using namespace std;

const int MN = 100 + 1;
int N, M, dp[MN][MN / 2]; // dp[i][j]는 i일까지 j개 쿠폰 가지고 있는 최소 가격 수.
bool chk[MN];             // 쉬는 날인지 확인

int f(int day, int coupon)
{
    if (day > N)
        return 0;
    if (dp[day][coupon] == -1)
        dp[day][coupon] = chk[day] ? f(day + 1, coupon) : min({coupon >= 3 ? f(day + 1, coupon - 3) : f(day + 1, coupon) + 10000, f(day + 3, coupon + 1) + 25000, f(day + 5, coupon + 2) + 37000});
    return dp[day][coupon];
}

int main()
{
    scanf("%d %d", &N, &M);
    for (int i = 0, get; i < M; ++i)
    {
        scanf("%d", &get);
        chk[get] = true;
    }
    fill(dp[0], dp[101], -1);
    printf("%d\n", f(1, 0));
    return 0;
}

 

'온라인저지' 카테고리의 다른 글

[BOJ] 1026번: 보물  (0) 2018.05.25
[BOJ] 11819번: The Shortest does not Mean the Simplest  (0) 2018.05.21
[BOJ] 2482번: 색상환  (0) 2018.05.21
[BOJ] 1463번: 1로 만들기  (0) 2018.05.20
[BOJ] 2448번: 별찍기 - 11  (0) 2018.05.15
[BOJ] 2523번: 별찍기 - 13  (0) 2018.05.15

댓글