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())) max_color = 50 size = 2 * n # 复制数组 A_ = A * 2 C_ = C * 2 # 预处理颜色对是否满足条件 color_diff = [[False] * (max_color + 1) for _ in range(max_color + 1)] for c in range(1, max_color + 1): for d in range(1, max_color + 1): if abs(c - d) <= K: color_diff[c][d] = True # 初始化dp数组 INF = float('-inf') dp = [[[INF] * (max_color + 1) for _ in range(size)] for __ in range(size)] for i in range(size): c_i = C_[i] dp[i][i][c_i] = A_[i] # 处理区间长度从2到n for l in range(2, n + 1): for i in range(size): j = i + l - 1 if j >= size: continue # 遍历分割点m for m in range(i, j): # 遍历颜色c和d for c in range(1, max_color + 1): if dp[i][m][c] == INF: continue for d in range(1, max_color + 1): if dp[m+1][j][d] == INF: continue if color_diff[c][d]: new_power = dp[i][m][c] + dp[m+1][j][d] # 更新颜色c和d的情况 if new_power > dp[i][j][c]: dp[i][j][c] = new_power if new_power > dp[i][j][d]: dp[i][j][d] = new_power # 寻找所有可能的区间中的最大值 max_val = 0 for i in range(n): for j in range(i, i + n): for c in range(1, max_color + 1): if dp[i][j][c] > max_val: max_val = dp[i][j][c] print(max_val) if __name__ == "__main__": main()