본문 바로가기

알고리즘/BOJ

15486번

15486번 - 퇴사(2)


기존의 퇴사 문제와 같다. 하지만 N제한이 커졌기 때문에 기존 문제처럼 완전탐색으로 해결할 수 없다. 


(시간복잡도가 최대 N^2 이 되기 때문에)


그리고 int 형 변수를 사용할지 long long 을 사용할지 확인해보면  P의 최대값이 1000이고, N의 1500000 이므로, 최대값은 15억으로 int 형 


변수로 충분히 해결할 수 있다.


최종적으로 DP를 이용해서 문제를 해결할 수 있다.


<정답 코드>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 1500001
int N;
int P[MAX];
int T[MAX];
int D[MAX];
int go(int k)
{
    if (k > N)
        return 0;
 
    if (D[k] != -1)
        return D[k];
 
    D[k] = 0;
 
    if (k + 1 <= N+1)
        D[k] = go(k + 1);
 
    if (k + T[k] <= N+1)
        D[k] = max(D[k], P[k] + go(k + T[k]));
 
    return D[k];
 
}
int main()
{
    //freopen("input.txt", "r", stdin);
    cin >> N;
    for (int i = 1; i <= N; i++)
        cin >> T[i] >> P[i];
    for (int i = 1; i <= MAX; i++)
        D[i] = -1;
 
    cout << go(1<< endl;
 
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

4991번  (0) 2018.10.07
15662번  (0) 2018.10.07
15658번  (0) 2018.10.07
15663번  (0) 2018.10.04
15684번  (0) 2018.09.06