結果

問題 No.1345 Beautiful BINGO
ユーザー gew1fw
提出日時 2025-06-12 20:59:10
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 2,476 bytes
コンパイル時間 172 ms
コンパイル使用メモリ 82,388 KB
実行使用メモリ 124,832 KB
最終ジャッジ日時 2025-06-12 21:03:00
合計ジャッジ時間 4,579 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 5 TLE * 1 -- * 55
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
import heapq

def main():
    N, M = map(int, sys.stdin.readline().split())
    A = []
    for _ in range(N):
        A.append(list(map(int, sys.stdin.readline().split())))
    
    lines = []
    
    # Rows
    for i in range(N):
        cells = set()
        total = 0
        for j in range(N):
            cells.add((i, j))
            total += A[i][j]
        lines.append((total, frozenset(cells)))
    
    # Columns
    for j in range(N):
        cells = set()
        total = 0
        for i in range(N):
            cells.add((i, j))
            total += A[i][j]
        lines.append((total, frozenset(cells)))
    
    # Diagonals
    cells = set()
    total = 0
    for i in range(N):
        j = i
        cells.add((i, j))
        total += A[i][j]
    lines.append((total, frozenset(cells)))
    
    cells = set()
    total = 0
    for i in range(N):
        j = N - 1 - i
        cells.add((i, j))
        total += A[i][j]
    lines.append((total, frozenset(cells)))
    
    all_lines = lines
    
    heap = []
    visited = {}
    
    initial_mask = 0
    initial_sum = 0
    heapq.heappush(heap, (initial_sum, initial_mask))
    visited[(initial_mask, 0)] = initial_sum
    
    min_total = float('inf')
    num_lines = len(all_lines)
    
    while heap:
        current_sum, current_mask = heapq.heappop(heap)
        
        k = bin(current_mask).count('1')
        if k >= M:
            if current_sum < min_total:
                min_total = current_sum
            continue
        
        if (current_mask, k) in visited and visited[(current_mask, k)] < current_sum:
            continue
        
        for i in range(num_lines):
            if not (current_mask & (1 << i)):
                new_mask = current_mask | (1 << i)
                new_k = k + 1
                
                line_sum, line_cells = all_lines[i]
                combined_cells = set()
                for bit in range(num_lines):
                    if new_mask & (1 << bit):
                        combined_cells.update(all_lines[bit][1])
                new_sum = sum(A[i][j] for (i, j) in combined_cells)
                
                state = (new_mask, new_k)
                if state in visited:
                    if visited[state] <= new_sum:
                        continue
                visited[state] = new_sum
                heapq.heappush(heap, (new_sum, new_mask))
    
    print(min_total)

if __name__ == "__main__":
    main()
0