結果
| 問題 |
No.2423 Merge Stones
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 14:44:05 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,293 bytes |
| コンパイル時間 | 163 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 69,120 KB |
| 最終ジャッジ日時 | 2025-06-12 14:44:54 |
| 合計ジャッジ時間 | 7,462 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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()
gew1fw