結果
問題 |
No.3306 Life is Easy?
|
ユーザー |
![]() |
提出日時 | 2025-09-28 08:45:27 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,136 bytes |
コンパイル時間 | 563 ms |
コンパイル使用メモリ | 82,912 KB |
実行使用メモリ | 82,172 KB |
最終ジャッジ日時 | 2025-09-28 08:45:49 |
合計ジャッジ時間 | 20,476 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 32 TLE * 3 |
ソースコード
def hungarian(n, c): w2j = list(range(n)) j2w = list(range(n)) p = [0] * n for i in range(1, n): cost = [1 << 60] * n prev = [-1] * n for j in range(i): cost[j2w[j]] = c[i][j] - c[j2w[j]][j] - p[j2w[j]] prev[j2w[j]] = i flg = [0] * n for j in range(i): min_c = 1 << 60 cur_j = -1 for k in range(i): if not flg[k] and min_c > cost[k]: min_c = cost[k] cur_j = k flg[cur_j] = 1 for k in range(i): new_c = cost[cur_j] + c[cur_j][k] - c[j2w[k]][k] - (p[j2w[k]] - p[cur_j]) if cost[j2w[k]] > new_c: cost[j2w[k]] = new_c prev[j2w[k]] = cur_j best_c = c[i][i] best_j = -1 for j in range(i): if best_c > cost[j] + p[j] + c[j][i]: best_c = cost[j] + p[j] + c[j][i] best_j = j for j in range(i): p[j] += cost[j] next_i = i while best_j != -1: j2w[next_i] = best_j next_i, w2j[best_j] = w2j[best_j], next_i best_j = prev[best_j] return w2j def solve(n, m, a): d = n // 2 if m == 1: ans = 0 for i in range(d): ans += a[~i][0] - a[i][0] return ans elif False: dp1 = [[1<<60] * (d + 1) for _ in range(d+1)] dp1[0][0] = 0 for i in range(d): for j in range(i+1): dp1[i+1][j] = min(dp1[i+1][j], dp1[i][j]+a[i][0]) dp1[i+1][j+1] = min(dp1[i+1][j+1], dp1[i][j]+a[i][1]) dp2 = [[0] * (d + 1) for _ in range(d+1)] for i in range(d): for j in range(i+1): dp2[~i-1][j] = max(dp2[~i-1][j], dp2[~i][j]+a[~i][0]) dp2[~i-1][j+1] = max(dp2[~i-1][j+1], dp2[~i][j]+a[~i][1]) ans = 0 for i in range(d+1): ans = max(ans, dp2[0][i]-dp1[d][i]) return ans c = [[0] * d for _ in range(d)] for i in range(d): for j in range(d): x = 0 for k in range(m): x = max(x, a[j+d+n%2][k] - a[i][k]) c[i][j] = -x res = hungarian(d, c) ans = 0 for i in range(d): ans -= c[i][res[i]] return ans n, m = map(int, input().split()) a = [list(map(int, input().split())) for _ in range(n)] print(solve(n, m, a))