''' WAだがいったん提出。同じところの扱いとかダメそう。 DPの仕方を工夫すべき? ABC 204 Dみたいにすべき? yukicoder No207 方針: ナップザックDP dp[i][x] = 問題0,1,2,...,iまで解答して、最後に人xが解答したときに解答時間が最も短くなる時の、[雪男の解答時間, 雪女の解答時間] *x = 雪男or雪女 入力例1: 3 最後に雪男が解答 最後に雪女が解答 45 50 -> [45,0] [0,50] 20 80 -> [20,50] *1 [45,80]*2 *1: [65,0]or[20,50]だと[20,50]のほうがよい *2: [45,80]or[0,130]だと[0,130]のほうがよい 40 15 -> [60,50] [20,65] メモ: i問目まで解けた時点での最短で、i+1問目を解く際の最短を考えれる 最後に雪男(人0)/雪女(人1)が解いたかで状態を圧縮できる(通常は最大2^100通り) ''' # 入力 N = int(input()) times = dict({0:[],1:[]}) # times[x][i] = 人xの問題iの解答時間 for i in range(N): a,b = list(map(int, input().split())) times[0].append(a) times[1].append(b) #print(times) # DP dp = [[[0,0],[0,0]] for _ in range(N+1)] # dp[i][x] = i問目を人xが解いて最短時間になるときの[人0の解答時間, 人1の解答時間] NUM_PERSONS = 2 for i in range(N): if(i == 0): dp[i][0] = [times[0][i],0] dp[i][1] = [0,times[1][i]] else: # 問題iを人0が解く # (1)問題i-1:人0、問題i:人0 が解く prev = 0 tmp_prev1 = dp[i-1][prev] tmp_now1 = [tmp_prev1[0]+times[0][i], tmp_prev1[1]] solve_time1 = max(tmp_now1) sum_times1 = sum(tmp_now1) # (2)問題i-1:人1、問題i:人0 が解く prev = 1 tmp_prev2 = dp[i-1][prev] tmp_now2 = [tmp_prev2[0]+times[0][i], tmp_prev2[1]] solve_time2 = max(tmp_now2) sum_time2 = sum(tmp_now2) # 比較 if(solve_time1 < solve_time2): dp[i][0] = tmp_now1[:] # コピーしたのを渡した方がよい? -> 変わらず elif(solve_time1 == solve_time2): # ここはだいぶ怪しい(先々まで見て考えないとダメな気がする...? 最後に回答している人が同じだから合計が少ないほうでよい?) dp[i][0] = tmp_now1[:] if(sum_time1 < sum_time2) else tmp_now2[:] else: dp[i][0] = tmp_now2[:] # 問題iを人1が解く # (3)問題i-1:人0、問題i:人1 が解く prev = 0 tmp_prev1 = dp[i-1][prev] tmp_now1 = [tmp_prev1[0], tmp_prev1[1]+times[1][i]] solve_time1 = max(tmp_now1) sum_time1 = sum(tmp_now1) # (4)問題i-1:人1、問題i:人0 が解く prev = 1 tmp_prev2 = dp[i-1][prev] tmp_now2 = [tmp_prev2[0], tmp_prev2[1]+times[1][i]] solve_time2 = max(tmp_now2) sum_time2 = sum(tmp_now2) # 比較 if(solve_time1 < solve_time2): dp[i][1] = tmp_now1[:] elif(solve_time1 == solve_time2): dp[i][1] = tmp_now1[:] if(sum_time1 < sum_time2) else tmp_now2[:] else: dp[i][1] = tmp_now2[:] #for tmp in dp: # print(tmp) # 最小値を求める ans = float("inf") for x in range(NUM_PERSONS): solve_time = max(dp[N-1][x]) ans = min(solve_time, ans) print(ans)