6개의 댓글이 있습니다.
-
-
Elevista -
~~~ c++
priority_queuePQ;
for (i = 1, N = 1; i <= _N; N++, i++) {
for (int V = 1; V <= _V; V++) {
//1. f(V)값을 PQ에 넣는다.
PQ.push(Pair(f(V), V));//2. PQ의 top인 x값이 V와 vi*ki를 넘게 차이나면 top을 제거한다 while (PQ.top().second > V && PQ.top().second > v[i] * k[i]) PQ.pop(); //3. PQ의 top인 f(x)값에 대해 D[N,V]=f(x)+V/vi*ci이다. D[N][V] = PQ.top().first + V / v[i] * c[i]; }}
~~~
아니에요 제 머리가 빠가인걸요 ㅠ
말씀듣고 소스코드 고쳐 보았는데요.
205가 210으로, 37이 44로 오답이 나오네요..
어디가 문제인 걸까요?
2번 스텝이 틀렸나요? 아니면 1번 스텝이 틀렸는지.. 아니면 3번?..
막막합니다 좌절중 ㅠ
11년 전 link
-
-
-
Elevista -
~~~ c++
for (i = 1, N = 1; i <= _N; N++, i++) {
for (int b = 0; b < v[i]; b++) {
priority_queuePQ;
for (int V = b; V <= _V; V += v[i]) {
//1. f(V)값을 PQ에 넣는다.
PQ.push(Pair(f(V), V));//2. PQ의 top인 x값이 V와 vi*ki를 넘게 차이나면 top을 제거한다 while (V - PQ.top().second > v[i] * k[i]) PQ.pop(); //3. PQ의 top인 f(x)값에 대해 D[N,V]=f(x)+V/vi*ci이다. D[N][V] = PQ.top().first + V / v[i] * c[i]; } }}
~~~
감사합니다 ㅠ 일단 정답은 뜨네요.
이제 어떻게 돌아가는건지 열심히 봐야겠습니다.. 감사합니다 ㅠ
11년 전 link
-
-
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.

Elevista
[[problem:BOOKTHIEF]]
[[Coders high 2013]] 이 위키에 나온 상세 솔루션을 보고
따라하는 중인데요
설명이 잘 이해가 안가는 부분이 있어서 질문드립니다.
J. 책도둑
평범한 0-1냅색이라고 가정하면 다음과 같은 DP식을 세울수있다:
$v_{i} = \text{(volume of item)}$, $c_{i} = \text{(value of item)}$이라고 하고, 아이템의 갯수를 $k_{i}$라 하자.
위의 식에서 0-1을 0-k로 확장시킨다는 느낌으로 식을 바꿔 써보면:
\[
\begin{aligned}
D[N, V] = max\{ & D[N-1, V],D[N-1, V-v_{i}]+c_{i},D[N-1, V-v_{i}*2]+c_{i}*2,\\
&..., D[N-1, V-v_{i}*k_{i}]+c_{i}*k_{i} \}
\end{aligned}
\]
묶어서 쓰면 다음처럼 쓸수있다.
\[
D[N, V] = \max_{x} \{D[N-1, x] + (V-x)/v_{i}*c_{i}\} \\
(단, x \equiv V \bmod v_{i} 이고, V-v_{i}*k_{i}≤ x ≤V이다.)
\]
$x$에 대한 식만 남기고 $V$에 대한 부분은 밖으로 뺄 수있다.
\[
D[N, V] = \max\{ D[N-1, x]-x/v_{i}*c_{i} \} + V/v_{i}*c_{i}
\]
$f(x) = D[N-1,x]-x/v_{i}*c_{i}$ 라고 하자.
그렇다면 $D[N, V]$를 다음과 같이 구할수 있다.
최대 PQ의 크기는 $O(V)$이므로, 시간 복잡도는 $O(NV lg V)$이다.
이렇게 작성해도 AC를 받기엔 충분한 속도지만, 조금 더 속도 향상을 할 수 있다.
PQ안에 있는 2개의 t_{1} < t_{2}에 대해 생각해보자.
만약 f(t_{1}) < f(t_{2})라면 t_{1}은 PQ의 top이 영원히 될수 없다.
그러므로 이러한 t_{1}은 전부 배제되었다고 가정하면,
1. PQ안 원소들의 x값들을 순서대로 x_{1}<x_{2}<x_{3}..라 하면
1. f(x_{1})≥f(x_{2})≥f(x_{3})≥...을 만족한다.
또한 위의 조건을 만족하도록 PQ를 관리하여야 한다.
이러한 구조는 선형 deque로도 관리할수있으며, 매 원소는 최대 한 번 삽입과 삭제가 발생하게 되므로 이때의 시간 복잡도는 amortized $O(NV)$이다.
현재 "$f(x) = D[N-1,x]-x/v_{i}*c_{i}$ 라고 하자." 부분까지 코드로
옮겨 보았습니다.
그 다음 설명부터 1,2,3 스텝을 코드로 옮기려고 하는데
설명이 이해가 잘 안되서요. 1번 스텝에서 f(V)값을 PQ에 넣었는데
2번 스텝에서 PQ.top()의 값이 x라는 부분이 잘 이해가 가지 않구요
f(x)값은 언제 PQ에 넣어서 top에 있는지 잘 모르겠구요
어디서 어떤 값들을 PQ에 push를 하는지 top을 제거를..
설명이 잘 이해가 안가서 질문도 뭐라 해야할지 모르겠네요 ㅠ
도와주세요ㅠ
그리고 $x \equiv V \bmod v_{i}$ 이 부분은 무슨 뜻인가요?
11년 전