提出 #27453026


ソースコード 拡げる

import sys,random,bisect
from collections import deque,defaultdict
from heapq import heapify,heappop,heappush
from itertools import cycle, permutations
from math import log,gcd

input = lambda :sys.stdin.readline().rstrip()
mi = lambda :map(int,input().split())
li = lambda :list(mi())

H,W = mi()
A = [input() for i 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 = [A[i][j] for j in range(W)]
    for k in range(W)[::-1]:
        if k!=W-1 and ok[k]==ok[k+1]:
            dp_c[i][i][k] = dp_c[i][i][k+1]
        else:
            dp_c[i][i][k] = k
    for j in range(i+1,H):
        for k in range(W):
            if ok[k]!=A[j][k]:
                ok[k] = ""
        for k in range(W)[::-1]:
            if ok[k]:
                if k!=W-1 and ok[k]==ok[k+1]:
                    dp_c[i][j][k] = dp_c[i][j][k+1]
                else:
                    dp_c[i][j][k] = k

for k in range(W):
    ok = [A[i][k] for i in range(H)]
    for i in range(H)[::-1]:
        if i!=H-1 and ok[i]==ok[i+1]:
            dp_r[k][k][i] = dp_r[k][k][i+1]
        else:
            dp_r[k][k][i] = i
    for l in range(k+1,W):
        for i in range(H):
            if ok[i]!=A[i][l]:
                ok[i] = ""
        for i in range(H)[::-1]:
            if ok[i]:
                if i!=H-1 and ok[i]==ok[i+1]:
                    dp_r[k][l][i] = dp_r[k][l][i+1]
                else:
                    dp_r[k][l][i] = i

"""
update
"""

for ans in range(17):
    if dp_c[0][H-1][0]==W-1:
        exit(print(ans))
    
    """
    dp_c:たての切断の分を更新
    dp_r:よこの切断の分を更新
    どちらもダブリングの要領で
    """

    for i in range(H):
        for j in range(i,H):
            tmp = dp_c[i][j]
            for k in range(W):
                next_c = tmp[k] + 1
                if next_c < W:
                    tmp[k] = tmp[next_c]
    
    for k in range(W):
        for l in range(k,W):
            tmp = dp_r[k][l]
            for i in range(H):
                next_r = tmp[i] + 1
                if next_r < H:
                    tmp[i] = tmp[next_r]
    
    """
    dp_c:よこの切断の分を更新
    l <= dp_c[i][j][k] iff j <= dp_r[k][l][i]
    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_r[k][l+1][i]:
                    l += 1
                if l > dp_c[i][j][k]:
                    dp_c[i][j][k] = l
    
    """
    dp_r:たての切断の分を更新
    j <= dp_r[k][l][i] iff l <= dp_c[i][j][k]
    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_c[i][j+1][k]:
                    j += 1
                if j > dp_r[k][l][i]:
                    dp_r[k][l][i] = j
    
    #dp_c = n_dp_c
    




            

提出情報

提出日時
問題 D - Complexity
ユーザ chinerist
言語 PyPy3 (7.3.0)
得点 1000
コード長 3289 Byte
結果 AC
実行時間 4930 ms
メモリ 200144 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1000 / 1000
結果
AC × 2
AC × 42
セット名 テストケース
Sample sample01.txt, sample02.txt
All sample01.txt, sample02.txt, in01.txt, in02.txt, in03.txt, in04.txt, in05.txt, in06.txt, in07.txt, in08.txt, in09.txt, in10.txt, in11.txt, in12.txt, in13.txt, in14.txt, in15.txt, in16.txt, in17.txt, in18.txt, in19.txt, in20.txt, in21.txt, in22.txt, in23.txt, in24.txt, in25.txt, in26.txt, in27.txt, in28.txt, in29.txt, in30.txt, in31.txt, in32.txt, in33.txt, in34.txt, in35.txt, in36.txt, in37.txt, in38.txt, sample01.txt, sample02.txt
ケース名 結果 実行時間 メモリ
in01.txt AC 3167 ms 172428 KiB
in02.txt AC 3667 ms 175404 KiB
in03.txt AC 3224 ms 164712 KiB
in04.txt AC 3802 ms 177232 KiB
in05.txt AC 2766 ms 158640 KiB
in06.txt AC 3439 ms 176236 KiB
in07.txt AC 4930 ms 199564 KiB
in08.txt AC 4807 ms 199668 KiB
in09.txt AC 432 ms 197636 KiB
in10.txt AC 108 ms 81468 KiB
in11.txt AC 1786 ms 199080 KiB
in12.txt AC 1904 ms 199408 KiB
in13.txt AC 2056 ms 199052 KiB
in14.txt AC 2322 ms 198896 KiB
in15.txt AC 2144 ms 198884 KiB
in16.txt AC 2132 ms 199028 KiB
in17.txt AC 2048 ms 148396 KiB
in18.txt AC 1497 ms 142832 KiB
in19.txt AC 1909 ms 143148 KiB
in20.txt AC 1417 ms 140392 KiB
in21.txt AC 4215 ms 199416 KiB
in22.txt AC 420 ms 197768 KiB
in23.txt AC 2593 ms 199912 KiB
in24.txt AC 3822 ms 199736 KiB
in25.txt AC 2434 ms 171180 KiB
in26.txt AC 3838 ms 200144 KiB
in27.txt AC 2918 ms 177408 KiB
in28.txt AC 3824 ms 193332 KiB
in29.txt AC 2450 ms 199600 KiB
in30.txt AC 2419 ms 199700 KiB
in31.txt AC 3282 ms 199960 KiB
in32.txt AC 3221 ms 199516 KiB
in33.txt AC 3582 ms 200112 KiB
in34.txt AC 3657 ms 199600 KiB
in35.txt AC 3819 ms 199812 KiB
in36.txt AC 3991 ms 200104 KiB
in37.txt AC 4460 ms 199572 KiB
in38.txt AC 4516 ms 199696 KiB
sample01.txt AC 126 ms 81248 KiB
sample02.txt AC 116 ms 82892 KiB