結果
問題 |
No.2375 watasou and hibit's baseball
|
ユーザー |
![]() |
提出日時 | 2025-04-15 23:25:21 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 908 ms / 2,000 ms |
コード長 | 2,976 bytes |
コンパイル時間 | 281 ms |
コンパイル使用メモリ | 82,256 KB |
実行使用メモリ | 134,472 KB |
最終ジャッジ日時 | 2025-04-15 23:26:38 |
合計ジャッジ時間 | 6,911 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 36 |
ソースコード
import sys from collections import defaultdict def main(): N, A, B = map(int, sys.stdin.readline().split()) X = [] Y = [] K = [] for _ in range(N): x, y, k = map(int, sys.stdin.readline().split()) X.append(x) Y.append(y) K.append(k) # Precompute distance and K differences dist = [[0] * N for _ in range(N)] k_diff = [[0] * N for _ in range(N)] for i in range(N): for j in range(N): dist[i][j] = abs(X[i] - X[j]) + abs(Y[i] - Y[j]) k_diff[i][j] = abs(K[i] - K[j]) # Initialize DP: mask -> {(prev, prev_prev): max_length} dp = defaultdict(dict) for i in range(N): mask = 1 << i dp[mask][(i, -1)] = 1 max_len = 1 current_bit_count = 1 while current_bit_count <= N: # Get all masks with current_bit_count bits masks_to_process = [] for mask in list(dp.keys()): if bin(mask).count('1') == current_bit_count: masks_to_process.append(mask) if not masks_to_process: current_bit_count += 1 continue for mask in masks_to_process: states = dp[mask] for (prev, prev_prev), length in states.items(): # Try adding each possible w not in mask for w in range(N): if (mask & (1 << w)) != 0: continue # Check conditions if prev_prev == -1: # j=2 cond2 = (dist[prev][w] >= A) cond3 = (k_diff[prev][w] >= B) if cond2 or cond3: new_mask = mask | (1 << w) new_state = (w, prev) new_length = length + 1 # Update dp if new_state not in dp[new_mask] or dp[new_mask].get(new_state, 0) < new_length: dp[new_mask][new_state] = new_length if new_length > max_len: max_len = new_length else: # j >=3 cond3 = (k_diff[prev][w] >= B) cond4 = (dist[prev][w] + dist[prev_prev][w] >= A) if cond3 or cond4: new_mask = mask | (1 << w) new_state = (w, prev) new_length = length + 1 if new_state not in dp[new_mask] or dp[new_mask].get(new_state, 0) < new_length: dp[new_mask][new_state] = new_length if new_length > max_len: max_len = new_length current_bit_count += 1 print(max_len) if __name__ == "__main__": main()