結果
問題 |
No.2423 Merge Stones
|
ユーザー |
![]() |
提出日時 | 2025-06-12 19:54:00 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,854 bytes |
コンパイル時間 | 189 ms |
コンパイル使用メモリ | 81,840 KB |
実行使用メモリ | 273,936 KB |
最終ジャッジ日時 | 2025-06-12 19:55:14 |
合計ジャッジ時間 | 6,796 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 10 TLE * 1 -- * 61 |
ソースコード
import sys def main(): N, K = map(int, sys.stdin.readline().split()) A = list(map(int, sys.stdin.readline().split())) C = list(map(int, sys.stdin.readline().split())) A += A C += C maxn = len(A) INF = -1e18 dp = [[[INF] * 51 for _ in range(maxn)] for __ in range(maxn)] # 初始化:区间长度为1的情况 for i in range(maxn): c = C[i] a = A[i] dp[i][i][c] = a # 预处理颜色兼容性矩阵 compat = [[False]*(51) for _ in range(51)] for c1 in range(51): for c2 in range(51): if abs(c1 - c2) <= K: compat[c1][c2] = True # 动态规划,处理区间长度从2到N for L in range(2, N+1): for i in range(maxn): j = i + L - 1 if j >= maxn: continue # 遍历所有可能的k for k in range(i, j): left = dp[i][k] right = dp[k+1][j] # 遍历所有可能的颜色对 for c1 in range(51): if left[c1] == INF: continue for c2 in range(51): if right[c2] == INF: continue if compat[c1][c2]: total = left[c1] + right[c2] if total > dp[i][j][c1]: dp[i][j][c1] = total if total > dp[i][j][c2]: dp[i][j][c2] = total max_total = 0 for i in range(maxn): for j in range(i, min(i + N, maxn)): for c in range(51): if dp[i][j][c] > max_total: max_total = dp[i][j][c] print(max_total) if __name__ == "__main__": main()