본문 바로가기

Algorithm/DP(Dynamic Programing)

(C++) - 백준(BOJ) 15486번 : 퇴사 2

반응형

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

 

15486번: 퇴사 2

첫째 줄에 N (1 ≤ N ≤ 1,500,000)이 주어진다. 둘째 줄부터 N개의 줄에 Ti와 Pi가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)

www.acmicpc.net

dp 문제였습니다.

 

 

📕 풀이방법

 수행 시간이 n이 150만이므로 O(n)에 수행해야 합니다. 제한사항이 영향을 끼치지 않기 때문에 본질적으로 퇴사문제와 풀이 방법이 같습니다.

 

 

제 풀이는 해당 문제에 대한 설명을 포스팅 한 글로 대체합니다.

 

https://codecollector.tistory.com/1113

 

(C++) - 백준(BOJ) 14501번 : 퇴사

https://www.acmicpc.net/problem/14501 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net dp문제였습니다. 📕 풀이방법  1. 두 가지 선택 방법이 있습니다. 현재 상담을..

codecollector.tistory.com


 

📕 Code

#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0); cin.tie(0);
using namespace std;
struct Consulting {int t, p; };
int n, d[1500001];
vector <Consulting> consult;

int dp(int i){
    if(i >= n) return 0;
    int &ret = d[i];
    if(ret != -1) return ret;
    ret = 0;
    if(i + consult[i].t <= n) ret = max(ret,dp(i+consult[i].t) + consult[i].p);
    ret = max(ret, dp(i+1));
    return ret;
}
int main(){
    memset(d,-1,sizeof(d));
    fastio;
    cin >> n;
    consult.resize(n);
    for(int i = 0,t,p; i < n; i++) cin >> t >> p, consult[i] = {t,p};
    cout << dp(0);
}