[백준] 1315번 RPG (C++)

2026. 3. 15. 15:39·Algorithm/Review
728x90

https://www.acmicpc.net/problem/1315

 

 

이 문제는 N개의 퀘스트가 주어질때 각각의 퀘스트에 필요한 요구치가 주어진다 이는 STR[i], INT[i]가 주어지며 퀘스트를 완료하기 위해서 현재 나의 스텟 중에 하나 이상이 퀘스트가 요구하는 스텟보다 크면 완료할 수 있으며 보너스로 스텟을 찍을 수 있는 포인트를 준다.

이때 최대로 완료할 수 있는 퀘스트의 개수를 구하는 문제이다.

 

스스로 해결: ❌

 

접근방법

어느정도 dp를 사용해서 풀어야하는 것은 알았지만 식을 어떻게 세워야할줄 몰랐다. 현재 내가 할 수 있는 행동은 각 퀘스트마다 내 스텟과 비교하여 완료할 수 있으면 다음퀘스트를 완료할 수 있는 가능성이 높아지기 때문에 무조건 완료하는것이 좋다고 생각하였다 또한 퀘스트 완료후 보너스 스텟에 대해 0부터 i까지 분배를 하여 모든 경우 찍어서 아직 완료하지 않은 퀘스트들을 세는 행동을 해야 한다.

 

결국 dp[i][j] = STR 이 i이고 INT가 j일때 완료할 수 있는 퀘스트의 최대 개수

라는 식을 세울 수 있었지만 코드로 작성을 하지는 못했다.

 

https://blog.naver.com/jhc9639/221402814267

 

해당 블로그를 참고하여 코드를 작성할 수 있었고 내가 구현 못한 부분을 발견할 수 있었다.

 

1. STR[i], INT[j] 인 상태에서 완료할 수 있는 퀘스트 확인

2. 보너스 스텟을 누적하여 저장

3. 0부터 보너스 스텟까지 스텟을 배분할 수 있는 모든 경우를 찾기

 

정답코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"

struct Tree {
    int Node, left, right;
};

const int INF = 1e9;
const int MAX = 20001;
const int D = 2000000;
const int MOD = 10007;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int N;
vector<tuple<int, int, int>> v;
int dp[1001][1001];

int func(int STR, int INT) {
    int &ret = dp[STR][INT];

    if(ret != -1) return ret;

    ret = 0;
    int pnt = 0;

    // 현재 완료할 수 있는 퀘스트 개수 세기
    for(int i = 0; i < N; i++) {
        int str = get<0>(v[i]);
        int intr = get<1>(v[i]);
        int pt = get<2>(v[i]);

        if(STR >= str || INT >= intr) {
            pnt += pt;
            ret++;
        }
    }

    int freepnt = pnt - (STR - 1) - (INT - 1);

    for(int i = 0; i <= freepnt; i++) {
        int nextstr = min(1000,STR + freepnt - i);
        int nextint = min(1000, INT + i);

        ret = max(ret, func(nextstr, nextint));
    }

    return ret;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);


    cin >> N;

    for(int i = 0; i < N; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        v.push_back({a, b, c});
    }

    memset(dp, -1, sizeof(dp));

    cout << func(1, 1);
}

 

 

728x90
저작자표시 (새창열림)

'Algorithm > Review' 카테고리의 다른 글

[LeetCode] 3020. Find the Maximum Number of Elements in Subset  (0) 2026.06.28
[LeetCode] 410. Split Array Largest Sum  (0) 2026.06.19
[백준] 2306번 유전자 (C++)  (0) 2026.03.19
'Algorithm/Review' 카테고리의 다른 글
  • [LeetCode] 3020. Find the Maximum Number of Elements in Subset
  • [LeetCode] 410. Split Array Largest Sum
  • [백준] 2306번 유전자 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (278)
      • Programming (47)
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (3)
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (1)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (5)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    linux
    DP
    c언어
    비트마스킹
    우선순위 큐
    브루트포스
    우선순위큐
    정렬
    누적합
    다익스트라
    깊이우선탐색
    백트래킹
    다이나믹 프로그래밍
    wargame
    그리디
    재귀
    Leviathan
    DFS
    그래프 이론
    Bandit
    구현
    백준
    트리
    이분탐색
    WebSecurity
    코딩
    BFS
    시뮬레이션
    에라토스테네스의 체
    투포인터
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 1315번 RPG (C++)
상단으로

티스토리툴바