AGC033 D - Complexity
https://atcoder.jp/contests/agc033/tasks/agc033_d
解答
code: python
H,W = map(int, input().split())
A = list(input()) for _ in range(H)
dp_c = [[k-1 for k in range(W) for j in range(H)] for i in range(H)]
dp_r = [[i-1 for i in range(H) for l in range(W)] for k in range(W)]
"""
init
"""
for i in range(H):
ok = [Aij for j in range(W)]
for k in range(W)::-1:
if k!=W-1 and okk==okk+1:
dp_ciik = dp_ciik+1
else:
dp_ciik = k
for j in range(i+1,H):
for k in range(W):
if okk!=Ajk:
okk = ""
for k in range(W)::-1:
if okk:
if k!=W-1 and okk==okk+1:
dp_cijk = dp_cijk+1
else:
dp_cijk = k
for k in range(W):
ok = [Aik for i in range(H)]
for i in range(H)::-1:
if i!=H-1 and oki==oki+1:
dp_rkki = dp_rkki+1
else:
dp_rkki = i
for l in range(k+1,W):
for i in range(H):
if oki!=Ail:
oki = ""
for i in range(H)::-1:
if oki:
if i!=H-1 and oki==oki+1:
dp_rkli = dp_rkli+1
else:
dp_rkli = i
"""
update
"""
for ans in range(17):
if dp_c0H-10==W-1:
exit(print(ans))
"""
dp_c:たての切断の分を更新
dp_r:よこの切断の分を更新
どちらもダブリングの要領で
"""
for i in range(H):
for j in range(i,H):
tmp = dp_cij
for k in range(W):
next_c = tmpk + 1
if next_c < W:
tmpk = tmpnext_c
for k in range(W):
for l in range(k,W):
tmp = dp_rkl
for i in range(H):
next_r = tmpi + 1
if next_r < H:
tmpi = tmpnext_r
"""
dp_c:よこの切断の分を更新
l <= dp_cijk iff j <= dp_rkli
jについて単調性があるのでjごとに尺取り
"""
for i in range(H):
for k in range(W):
l = k-1
for j in range(i,H)::-1:
while l!=W-1 and j <= dp_rkl+1i:
l += 1
if l > dp_cijk:
dp_cijk = l
"""
dp_r:たての切断の分を更新
j <= dp_rkli iff l <= dp_cijk
lについて単調線があるのでlについて尺取り
"""
for k in range(W):
for i in range(H):
j = i-1
for l in range(k,W)::-1:
while j!=H-1 and l <= dp_cij+1k:
j += 1
if j > dp_rkli:
dp_rkli = j
テーマ
#dp
蟻本 2-3 01ナップサック問題その2
メモ
https://atcoder.jp/contests/agc033/submissions/27453026
AtCoder AGC 033 D - Complexity (赤色, 1000 点)