結果
| 問題 |
No.2423 Merge Stones
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 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()
gew1fw