====== Batch Scheduling ====== ===== 풀이 ===== * 지문이 영어인데다가 잘 안읽힌다.. * 배치별로 나누면 같은 배치안에서는 똑같은 O값을 갖게 된다. 따라서 i...j 를 배치로 묶으면 그 배치안의 잡들의 코스트의 합은 그냥 Oi*(Fi+...+Fj) 가 된다. * 그러면 이제 대충 DP 형태로 점화식을 세울수 있을것 같은 느낌이 든다. * DP[i]를 i까지의 잡을 처리하는데에 드는 최소 코스트라고 하면, dp[i] = {j까지의 잡을 처리하는데 든 코스트} + {j번부터 i까지를 묶은 배치의 코스트} 형태로 표현이 될거 같다. * DP[i] = min_{ji} {DP[j] + S*(SF[N-1] - SF[i]) + SF[i]*(ST[i] - ST[j])} 로 1차원 형태로 깔끔하게 표현된다! * 자 그리고 이제, i에 관한 텀을 기준으로 식을 다시 정리해보면 * DP[i] = min_{j>i} {-ST[j]*SF[i] + DP[j] + S*(SF[N-1]-SF[i])+SF[i]*ST[i]} 형태이므로 [[ps:cht]]를 이용해서 빠르게 계산할 수 있다. -ST[j]는 단조감소, SF[i]는 단조증가하므로 O(n)에 계산이 가능하다 * 이제 식이고 최적화 방법이고 다 나왔으니 그대로 구현만 하면 되기는 하는데.. 구현할때 실수할 여지가 많기는 하다. 일단 위의 식은 DP[n-1]에서 출발해서 DP[n-2],dp[n-3],...을 채워나가는 식인데, 식이 꼬이기 쉽다. 그리고 teflib의 convexhulltrick.dp_with_cht 함수에 그냥 넣을수도 없다. DP'[i]= DP[N-1-i] 이런식으로 테이블을 다시 정의하고 0에서부터 출발해서 채우도록 바꾸는게 차라리 쉬웠다 * ST[0]=0, ST[x] = T[0]+...+T[x-1] 로 정의를 살짝 바꾸고 식을 다시 쓰면 아래처럼 된다. (SF도 마찬가지) * DP'[0] = ST[N]*SF[N] * DP'[i] = min_{j """Solution code for "BOJ 5498. Batch Scheduling". - Problem link: https://www.acmicpc.net/problem/5498 - Solution link: http://www.teferi.net/ps/problems/boj/5498 Tags: [DP] [CHT] """ import sys from teflib import convexhulltrick def main(): N = int(sys.stdin.readline()) S = int(sys.stdin.readline()) T_and_F = [[int(x) for x in sys.stdin.readline().split()] for _ in range(N)] f_sum = [v := 0] + [v := v + f for t, f in T_and_F] t_sum = [v := 0] + [v := v + t for t, f in T_and_F] c = f_sum[-1] * S dp = [None] * (N + 1) dp[0] = t_sum[-1] * f_sum[-1] dp = convexhulltrick.dp_with_cht( cht=convexhulltrick.ConvexHullTrickForIncreasingQueries(), dp=dp, f_j=lambda j: t_sum[N - j], f_i=lambda i: -f_sum[N - i], g_j=lambda j: dp[j], g_i=lambda i: f_sum[N - i] * (t_sum[N - i] - S) + c, ) print(dp[-1]) if __name__ == '__main__': main() * Dependency: * [[:ps:teflib:convexhulltrick#dp_with_cht|teflib.convexhulltrick.dp_with_cht]] * [[:ps:teflib:convexhulltrick#ConvexHullTrickForIncreasingQueries|teflib.convexhulltrick.ConvexHullTrickForIncreasingQueries]] {{tag>BOJ ps:problems:boj:플래티넘_3}}