반응형
클릭시 이동합니다.
어떻게 풀까?
현재가 X일이 지난 상태이고 일을 할 수 있는 상태라고 가정해봅시다!
그럼, X일 에서의 의뢰를 수행할 수 있겠죠! 이 일을 할 때 벌어들인 금액이 가장 최댓값이 되기 위해서는 어떻게 해야할까요?
답은 간단합니다! X일 전까지 일했던 금액이 가장 많게 하면 되죠!
현재가 X일이라고 했을 때, X-1+T[X]일의 금액 값과, X-1일까지 마친 금액 + P[X] 값 중 큰 값을 X-1 + T[X]일의 벌이로 기록하는 것입니다!
이렇게 하면, n일에 저장된 값을 바로 출력하면 되죠!
이를 위해, 간단한 DP점화식을 만들 수 있죠.
그리고, 인덱스 오류를 피하기 위해서 X +T[X]가 n을 넘어갈 때에는 무시하도록 합시다!
코드
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 | #include<iostream> #include<cstring> #include<cstdio> using namespace std; typedef enum {Time = 0, Price = 1, size} type; int info[2][16]; int retireMax[16]; inline int Retire_Max(int i1, int i2) { return i1 > i2 ? i1 : i2; } int main() { memset(retireMax, 0, sizeof(retireMax)); int n; scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d %d\n", &info[Time][i], &info[Price][i]); if(info[Time][i] + i - 1 <= n) retireMax[info[Time][i] + i - 1] = Retire_Max(retireMax[info[Time][i] + i - 1], retireMax[i-1] + info[Price][i]); retireMax[i] = Retire_Max(retireMax[i], retireMax[i-1]); } printf("%d\n", retireMax[n]); return 0; } | cs |
시간 복잡도
반복문이 n까지 반복되기 때문에 시간복잡도는 O(N) 입니다.
반응형
'공부 > 알고리즘 문제풀이' 카테고리의 다른 글
[삼성 기출 문제] 백준 14503 로봇 청소기 (0) | 2018.12.05 |
---|---|
[삼성 기출 문제] 백준 14502 연구소 (0) | 2018.12.01 |
[삼성 기출 문제] 백준 14500 테트로미노 (0) | 2018.12.01 |
[삼성 기출 문제] 백준 14499 주사위 굴리기 (1) | 2018.12.01 |
[삼성 기출 문제] 백준 3190 뱀 (0) | 2018.11.30 |