티스토리 뷰

Pictures with Kittens (easy version)
(http://codeforces.com/problemset/problem/1077/F1)
Pictures with Kittens (hard version)
(http://codeforces.com/problemset/problem/1077/F2)


난이도가 easy가 2100, hard가 2300인데 사실 그 정도는 아닌 것 같다.
Div3 마지막 문제들이었는데 내 힘으로 풀어서 조금 뿌듯하다. 근데 대회에서 푼 건 아니라서 조금 아깝다.
이런 dp 최적화는 간단하고 충분히 또 나올만 해서 풀이를 적어둬야겠다.

easy는 간단하게 dp로 풀 수 있다.
일단 Di,ji번째 사진을 선택하고 총 j개를 골랐을 때의 최댓값이라고 한다.
그러면 D0,0=0으로 두고 Di,j=max(Dt,j1)+ai(ikti1)이다. (물론 도달하지 못 하는 경우는 따로 처리한다.)

그러면 모든 (i,j)쌍에서 iki1을 전부 확인해 최댓값을 찾는다면 O(nkx)의 시간복잡도를 가진다.
easy에서 nkx는 최대 2003이므로 통과할 수 있다.

hard는 n,k,x가 모두 5000으로 늘었는데, 하나에 log가 붙는 것도 힘들어보이니 셋 중 적어도 하나는 없애야 한다는 의미다.
우선 n은 지우기 힘들어 보인다. 그리고 위 dp식을 유지하려면 x도 필수적이다. (물론 이럴 때 dp식을 바꿔야 하는 경우도 있고, 식 자체를 버려야 하는 경우도 있긴 하다.)
그러면 이제 k를 없앨 방법을 찾아야한다.

위에서는 (i,j)쌍에서 iki1를 전부 탐색하며 최댓값을 찾았다.
하지만 관찰해보면, iki1i에 따라서 같이 움직인다. 그러니 매번 k개를 확인하는건 비효율적이다.
i가 늘어나면 앞에서 한 개 빠지고 뒤에서 한 개 들어오니, 덱을 쓰기 좋아보인다.
앞에서 보며 ik보다 앞에 있던 것들은 빼고, 뒤에서 보며 Di,j를 넣는데 내림차순이 되도록 최댓값을 저장해두면 된다.
이 과정을 거쳤을 때 덱의 앞이 max(Dt,j1)(ikti1)가 된다.
이러한 덱을 x개 관리해주면 된다.

아마도 연세워터파 문제에도 이 방식을 적용할 수 있다.

'문제' 카테고리의 다른 글

BOJ 16565 N포커  (0) 2018.11.27
BOJ 16456 하와와 대학생쨩 하와이로 가는 거시와요~  (0) 2018.11.20
BOJ 2867 수열의 값  (0) 2018.11.11
Codeforces 1070C Cloud Computing  (0) 2018.11.11
BOJ 1819 불끄기  (0) 2018.10.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함