문제

 

먼저 사탕의 개수를 최대화 하는 문제는 k번째 사탕을 tk시간에 먹었다고 할때 tk 합을 최소화 하는 문제와 동치라는것을 알 수 있다. (문제를 좀더 쉽게 하기 위해 일단 tkm이라는 가정을 하자.)

 

그리고 나서 가장 먼저 dp[l][r]을 사탕의 구간 lr 에 대해서 tk합의 최솟값으로 정의하려고 시도해 볼 수 있다. 하지만 이렇게 하면 적절한 점화식을 구할 수 없다.

 

k번째로 먹은 사탕을 시간 tk때 먹었다고 하자. (tk의 정의가 이전과 다음에 주의하자.)

우리는 최소화 하려는 대상은 t1+t2++tn 이다. 그런데 잘 생각해보면 t2,t3,,tn에는 모두 t1이 더해져 있고, 똑같이 t3,t4,,tn에는 t2가 더해져 있다는걸 자명하게 알 수 있다.

 

방금 알아낸 사실을 이용해 다음과 같이 dp를 정의해보자.

  • dp[l][r][t] : 1번째부터 (rl+1)번째로 먹은 사탕이 구간 l r에 하나씩 있고 마지막 위치가 t (t==0 ? 왼쪽 : 오른쪽) 일때 [t1+t2trl+1+trl+1(n(rl+1))] 의 최솟값
  • dp[l][r][t]=|pl=r|nwherel=r
  • dp[l][r][t]=mint=0,1[dp[l][r][t]+|pipi|(n(rl))]wherel<r

이때 pk는 정렬된 순서에서 k번째 사탕의 위치를 나타낸다. it=0인 경우 l, t=1인 경우 r이다.

현재 상태가 (l,r,t)라면 이전 상태의 후보는 (l,r,t)t=0인 경우 (l+1,r,t=0,1), t=1인 경우 (l,r1,t=0,1)이 된다.

 

이렇게 dp를 정의하면 우리가 하고자 했던 tk의 합을 전체 구간에 대해 최소화 할 수 있다.

하지만 이 dp는 어떤 tkm을 초과하는 경우 즉, 최소화 하려는 대상이 min(tk,m)인 경우 답을 보장하지 못한다.m을 초과하는 경우에도 답을 구하기 위해서는 다음을 관찰해야 한다.

  • min(tk,m)를 최소화 하는 문제는 결국 tk>m인 사탕들을 제외한 사탕들에 대해 tk를 최소화하는 문제로 바꿀 수 있다.

 

그러므로 우리는 기존에 전체 구간에 대해 tk 최소화 문제를 풀었던것과 달리 모든 구간에 대해 tk 최소화 문제를 풀어주면 답을 구할 수 있다.

  • dp[l][r][t] : 1번째부터 (rl+1)번째로 먹은 사탕이 구간 l r에 하나씩 있고 마지막 위치가 t (t==0 ? 왼쪽 : 오른쪽) 일때 [t1+t2trl+1+trl+1(c(rl+1))] 의 최솟값
  • dp[l][r][t]=|pl=r|nwherel=r
  • dp[l][r][t]=mint=0,1[dp[l][r][t]+|pipi|(c(rl))]wherel<r

 

단순히 기존의 nc로 바꾸고, c=1,2,,n에 대해 각각 dp를 풀어주면 된다. 총 시간복잡도는 O(n3) 이 된다.

'PS' 카테고리의 다른 글

백준 - 전령들(3319)  (0) 2024.05.19
백준 - 수열 나누기(10067)  (0) 2024.05.15
백준 - 땅따먹기(6171)  (0) 2024.05.09
백준 - 트리 색칠하기(1693)  (0) 2024.05.06
백준 - RPG(1315)  (0) 2024.05.05
zanzun