結果

問題 No.2423 Merge Stones
ユーザー gew1fw
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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()
0