結果
問題 |
No.2423 Merge Stones
|
ユーザー |
![]() |
提出日時 | 2025-06-12 19:52:28 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,293 bytes |
コンパイル時間 | 227 ms |
コンパイル使用メモリ | 82,336 KB |
実行使用メモリ | 69,532 KB |
最終ジャッジ日時 | 2025-06-12 19:53:18 |
合計ジャッジ時間 | 6,336 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 6 WA * 4 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_ext = A + A C_ext = C + C size = 2 * N # 计算前缀和 prefix_sum = [0] * (size + 1) for i in range(1, size + 1): prefix_sum[i] = prefix_sum[i - 1] + A_ext[i - 1] # 初始化dp表 max_color = 50 dp = [[{'sum': 0, 'mask': 0} for _ in range(size + 1)] for __ in range(size + 1)] for i in range(1, size + 1): c = C_ext[i - 1] dp[i][i]['sum'] = A_ext[i - 1] dp[i][i]['mask'] = 1 << (c - 1) # 动态规划 for l in range(2, N + 1): for i in range(1, size + 1): j = i + l - 1 if j > size: break dp[i][j]['sum'] = 0 dp[i][j]['mask'] = 0 for k in range(i, j): if dp[i][k]['sum'] == 0 or dp[k + 1][j]['sum'] == 0: continue mask1 = dp[i][k]['mask'] mask2 = dp[k + 1][j]['mask'] # 检查是否存在c1和c2满足条件 valid = False for c1 in range(1, 51): if (mask1 & (1 << (c1 - 1))) == 0: continue min_c2 = max(1, c1 - K) max_c2 = min(50, c1 + K) # 构造允许的颜色掩码 allowed = 0 for c in range(min_c2, max_c2 + 1): allowed |= (1 << (c - 1)) if (allowed & mask2) != 0: valid = True break if valid: new_sum = dp[i][k]['sum'] + dp[k + 1][j]['sum'] new_mask = mask1 | mask2 if new_sum > dp[i][j]['sum']: dp[i][j]['sum'] = new_sum dp[i][j]['mask'] = new_mask # 找出最大的sum max_val = 0 for i in range(1, size + 1): for j in range(i, min(i + N - 1, size)): if dp[i][j]['sum'] > max_val: max_val = dp[i][j]['sum'] print(max_val) if __name__ == '__main__': main()