結果
| 問題 | 
                            No.2473 Fraises dans une boîte
                             | 
                    
| コンテスト | |
| ユーザー | 
                            👑  SPD_9X2
                         | 
                    
| 提出日時 | 2023-07-17 21:21:12 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                RE
                                 
                             
                            
                            (最新)
                                AC
                                 
                             
                            (最初)
                            
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 3,442 bytes | 
| コンパイル時間 | 254 ms | 
| コンパイル使用メモリ | 82,432 KB | 
| 実行使用メモリ | 83,732 KB | 
| 最終ジャッジ日時 | 2024-11-07 08:40:50 | 
| 合計ジャッジ時間 | 25,262 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 36 RE * 29 | 
ソースコード
"""
Fraises dans une boîte(6) 想定解
6乗ver
"""
import sys
from sys import stdin
H,W = map(int,stdin.readline().split())
S = [list(map(int,stdin.readline().split())) for i in range(H)]
# 制約チェック
assert 1 <= H <= 22
assert 1 <= W <= 22
assert len(S) == H
for s in S:
    assert len(s) == W
    for i in s:
        assert i == 0 or i == 1
# 領域の和を高速に導出するための2次元累積和
SSum = [[0] * (W+1) for i in range(H+1)]
for i in range(H):
    for j in range(W):
        SSum[i+1][j+1] += S[i][j]
for i in range(H):
    for j in range(W+1):
        SSum[i+1][j] += SSum[i][j]
for i in range(H+1):
    for j in range(W):
        SSum[i][j+1] += SSum[i][j]
# メモ化用の4次元list
inf = float("inf")
lis = [[[[0] * (W+1) for i in range(W+1)] for j in range(H+1)] for k in range(H+1)]
# ここからdp
for hsize in range(1,H+1): #縦のサイズが小さい領域から調べる
    for wsize in range(1,W+1): #横のサイズが小さい領域から調べる
        for x1 in range(H): #左上のx座標
            x2 = x1 + hsize
            if x2 > H:
                break
            
            for y1 in range(W): #左上のy座標
                y2 = y1 + wsize
                if y2 > W:
                    break
                # ここから、最小値の導出処理
                now_ans = inf
                # 左上領域の空行カウント用の配列
                zerox = [0]
                zeroy = [0]
                for tmpx in range(x1,x2):
                    nsum = 0
                    for tmpy in range(y1,y2):
                        nsum += S[tmpx][tmpy]
                    if nsum == 0:
                        pl = 1
                    else:
                        pl = 0
                    zerox.append(zerox[-1] + pl)
                for tmpy in range(y1,y2):
                    nsum = 0
                    for tmpx in range(x1,x2):
                        nsum += S[tmpx][tmpy]
                    if nsum == 0:
                        pl = 1
                    else:
                        pl = 0
                    zeroy.append(zeroy[-1] + pl)
                #print (zerox,zeroy)
                for xmid in range(x1,x2+1):
                    for ymid in range(y1,y2+1):
                        #右下が0で無い場合、駄目
                        if SSum[x2][y2] - SSum[xmid][y2] - SSum[x2][ymid] + SSum[xmid][ymid] != 0:
                            continue
                        #左上・右下共に0の場合は推移の意味が無いのでダメ
                        if (xmid-x1) * (ymid-y1) == 0 and (x2-xmid) * (y2-ymid) == 0:
                            continue
                        cost = 0
                        # 左上区間の1の個数
                        lu1 = SSum[xmid][ymid] - SSum[xmid][y1] - SSum[x1][ymid] + SSum[x1][y1]
                        cost += (xmid-x1-zerox[xmid-x1]) * (ymid-y1-zeroy[ymid-y1]) - lu1
                        # 左下と右上
                        cost += lis[xmid][x2][y1][ymid] + lis[x1][xmid][ymid][y2]
                        # デバッグ用
                        #print (x1,xmid,x2,y1,ymid,y2,cost)
                        now_ans = min(now_ans , cost)
                        
                lis[x1][x2][y1][y2] = now_ans
                # デバッグ用
                #print (x1,x2,y1,y2,now_ans)
print (lis[0][H][0][W])
            
            
            
        
            
SPD_9X2