티스토리 뷰
문제 요약
- \(t_i\): \(i\)번째 item을 구하는데 소요되는 시간
- \(d_i\): \(i\)번째 item의 가치가 유효한 시간, 즉 가치를 지켜내기 위해 구해내야만 하는 시간
- \(p_i\): \(i\)번째 item의 가치
item들을 어떤 순서로 어떤 것들을 구하는지에 따라 얻을 수 있는 가치의 총합이 달라진다. 이때 가능한 가장 큰 가치의 합을 구하는 문제다.
- \(t_i\): \(i\)번째 item을 구하는데 소요되는 시간
- \(d_i\): \(i\)번째 item의 가치가 유효한 시간, 즉 가치를 지켜내기 위해 구해내야만 하는 시간
- \(p_i\): \(i\)번째 item의 가치
item들을 어떤 순서로 어떤 것들을 구하는지에 따라 얻을 수 있는 가치의 총합이 달라진다. 이때 가능한 가장 큰 가치의 합을 구하는 문제다.
문제 풀이
가장 단순한 방법은 가능한 모든 경우를 따져보는 것이다. 모든 경우를 다 따져볼 경우 각각의 item을 구할지 말지를 정해야 하고, 해당 item들을 어떤 순서로 구해야 하는지 따져봐야 하므로 시간복잡도는 \(O(2^n \times n!)\)이다. 문제에서 주어진 최대 \(n\)의 크기를 고려하면 너무 느린 방법이다.
가장 단순한 방법은 가능한 모든 경우를 따져보는 것이다. 모든 경우를 다 따져볼 경우 각각의 item을 구할지 말지를 정해야 하고, 해당 item들을 어떤 순서로 구해야 하는지 따져봐야 하므로 시간복잡도는 \(O(2^n \times n!)\)이다. 문제에서 주어진 최대 \(n\)의 크기를 고려하면 너무 느린 방법이다.
최적해가 어떤 형태를 가질지 고민해보면 더 좋은 알고리즘에 대한 힌트를 얻을 수 있다. 최적해가 아래와 같다고 해보자(여기서 \(p, q, r, s\)는 몇 번째 item인지를 나타낸다고 하자).
$$p, ..., q, r, ..., s$$
여기서 \(d_q \gt d_r\)라고 해보자, 즉 \(q\)번째 item의 가치가 유효한 시간이 \(r\)번째 item의 시간보다 더 긴 경우다. 이 경우 두 item의 순서를 바꾼다고 하더라도 가치의 합이 더 나빠지지 않음을 확인할 수 있다. 따라서 인접한 두 item들의 순서를 \(d_i\)값이 작은 item이 앞 쪽에 오도록 정렬하더라도 최적해를 구할 수 있다. 그러면 item들을 구하는 순서는 정해진다.
최적해가 어떤 형태를 가질지 고민해보면 더 좋은 알고리즘에 대한 힌트를 얻을 수 있다. 최적해가 아래와 같다고 해보자(여기서 \(p, q, r, s\)는 몇 번째 item인지를 나타낸다고 하자).
$$p, ..., q, r, ..., s$$
여기서 \(d_q \gt d_r\)라고 해보자, 즉 \(q\)번째 item의 가치가 유효한 시간이 \(r\)번째 item의 시간보다 더 긴 경우다. 이 경우 두 item의 순서를 바꾼다고 하더라도 가치의 합이 더 나빠지지 않음을 확인할 수 있다. 따라서 인접한 두 item들의 순서를 \(d_i\)값이 작은 item이 앞 쪽에 오도록 정렬하더라도 최적해를 구할 수 있다. 그러면 item들을 구하는 순서는 정해진다.
어떤 순서대로 item들을 골라야 하는지 정해지면 문제는 쉬워진다. 아래와 같이 부분 문제를 정의해보자.
dp[i][ct]: 현재 시간이 ct일 때, i ~ n번째 item에서 얻을 수 있는 최대 가치 합
위와 같은 부분 문제는 i번째 item을 구하느냐 마느냐에 따라 최대 가치 합이 달라진다. 따라서 선택에 따라 전이되는 다음 부분 문제들과의 관계를 세우면 문제를 \(O(n \times T)\)(여기서 \(T\)는 부분 문제에서 가능한 최대 시간이다. 가능한 최대 \(t\)값에 \(n\)을 곱한 값이라 볼 수 있다)에 풀 수 있다.
어떤 순서대로 item들을 골라야 하는지 정해지면 문제는 쉬워진다. 아래와 같이 부분 문제를 정의해보자.
dp[i][ct]: 현재 시간이 ct일 때, i ~ n번째 item에서 얻을 수 있는 최대 가치 합
위와 같은 부분 문제는 i번째 item을 구하느냐 마느냐에 따라 최대 가치 합이 달라진다. 따라서 선택에 따라 전이되는 다음 부분 문제들과의 관계를 세우면 문제를 \(O(n \times T)\)(여기서 \(T\)는 부분 문제에서 가능한 최대 시간이다. 가능한 최대 \(t\)값에 \(n\)을 곱한 값이라 볼 수 있다)에 풀 수 있다.
'알고리즘 문제 풀이' 카테고리의 다른 글
CF 785E Anton and Permutation (0) | 2017.03.27 |
---|---|
평방 분할 기법 (Square Root Decomposion Technique) (0) | 2017.03.27 |
777E Hanoi Factory (0) | 2017.03.02 |
777D Cloud of Hashtags (0) | 2017.03.01 |
777C Alyona and Spreadsheet (0) | 2017.03.01 |
- Total
- Today
- Yesterday
- sort
- Dynamic Programming
- suffix array
- pattern matching
- branch and bound
- Graph
- divide and conquer
- Heap
- sliding window
- parametric search
- Fenwick Tree
- BFS
- Segment Tree
- constructive algorithms
- search
- Strings
- greedy
- math
- karatsuba
- Minimum Spanning Tree
- tree
- Square root decomposition
- Binary search
- Data structure
- implementation
- kmp search
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |