結果
問題 | No.2473 Fraises dans une boîte |
ユーザー |
👑 ![]() |
提出日時 | 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 sysfrom sys import stdinH,W = map(int,stdin.readline().split())S = [list(map(int,stdin.readline().split())) for i in range(H)]# 制約チェックassert 1 <= H <= 22assert 1 <= W <= 22assert len(S) == Hfor s in S:assert len(s) == Wfor 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次元listinf = float("inf")lis = [[[[0] * (W+1) for i in range(W+1)] for j in range(H+1)] for k in range(H+1)]# ここからdpfor hsize in range(1,H+1): #縦のサイズが小さい領域から調べるfor wsize in range(1,W+1): #横のサイズが小さい領域から調べるfor x1 in range(H): #左上のx座標x2 = x1 + hsizeif x2 > H:breakfor y1 in range(W): #左上のy座標y2 = y1 + wsizeif y2 > W:break# ここから、最小値の導出処理now_ans = inf# 左上領域の空行カウント用の配列zerox = [0]zeroy = [0]for tmpx in range(x1,x2):nsum = 0for tmpy in range(y1,y2):nsum += S[tmpx][tmpy]if nsum == 0:pl = 1else:pl = 0zerox.append(zerox[-1] + pl)for tmpy in range(y1,y2):nsum = 0for tmpx in range(x1,x2):nsum += S[tmpx][tmpy]if nsum == 0:pl = 1else:pl = 0zeroy.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:continuecost = 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])