





H,W,K = list(map(int, input().split()))

S = [[int(i) for i in list(eval(input()))] for _ in range(H)]



accum_col = [[0 for _ in range(W)] for _ in range(H)]



for i in range(H):

    for j in range(W):

        if i == 0:

            accum_col[i][j] = S[i][j]

        else:

            accum_col[i][j] = accum_col[i-1][j] + S[i][j]



def cnt_white(x, a, b):

    if a == 0:

        return accum_col[b-1][x]

    else:

        return accum_col[b-1][x] - accum_col[a-1][x]



ans = H*W

for bit in range(1 << (H-1)):

    # 横に直線で割るが、その線の真下のindex

    horizs = [0]

    cnt_split = bin(bit).count("1")

    for i in range(H-1):

        if bit & (1 << i):

            """

            i=0でbitに1が立っていると、y=0と1の間を横一直線に割るので、次のブロックの始まりはy=1から。

            みたいな意味でi+1

            """

            horizs.append(i+1)

    

    horizs.append(H)

    # horizsの要素間がブロックなので-1

    # これまでの各ブロックの累積のホワイトチョコの個数

    prev = [0] * (len(horizs) - 1)

    for x in range(W):

        # 横位置でxの列の各ブロックのホワイトチョコの個数

        curr_col = [cnt_white(x, a, b) for a,b in zip(horizs, horizs[1:])]

        # 各ブロックの個数

        prev_curr = [curr_col[i] + prev[i] for i in range(len(horizs)-1)]

        if max(curr_col) > K:

            # 一行だけみてもKを超えるブロックがあるので、十分大きい値を足してアウトにする

            cnt_split += H*W

            break

        if max(prev_curr) > K:

            # ホワイトチョコが最も多いブロックでKを超えていれば、手前の列までで割る

            prev = curr_col

            cnt_split += 1

        else:

            # いずれもK以下であればそのままブロックを広げる

            prev = prev_curr

    

    ans = min(ans, cnt_split)



print(ans)









H,W,K = list(map(int, input().split()))

S = [[int(i) for i in list(eval(input()))] for i in range(H)]



# 縦の累積ホワイトチョコ数

whites_col = [[0 for _ in range(W)] for _ in range(H)]

for w in range(W):

    for h in range(H):

        if h == 0:

            whites_col[h][w] = S[h][w]

        else:

            whites_col[h][w] = whites_col[h-1][w] + S[h][w]



"""

マス目で考えると、縦Hマスある場合はH+1本の横線がある。

その横線の番号を渡して、その間にある数をとってくる

"""

def calc(w, a,b):

    if a == 0:

        return whites_col[b-1][w]

    else:

        return whites_col[b-1][w] - whites_col[a-1][w]



ans = (H-1)*(W-1)

for bit in  range(1 << (H-1)):

    

    cnt_split = bin(bit).count("1")



    divs = [0]

    for i in range(H-1):

        if bit & (1 << i):

            divs.append(i+1)

    divs.append(H)



    curr = [0] * (len(divs)-1)

    prev = [0] * (len(divs)-1)

    over_K_in_curr = False

    for w in range(W):

        for i,(a,b) in enumerate(zip(divs, divs[1:])):

            curr[i] = calc(w, a, b)



        over_K_in_curr = False

        if max(curr) > K:

            over_K_in_curr = True

            break

        

        for i in range(len(divs)-1):

            prev[i] += curr[i]



        if max(prev) > K:

            cnt_split += 1

            prev = curr[:]



    if not over_K_in_curr:

        ans = min(ans, cnt_split)



print(ans)

            



        

        
H, W, K = list(map(int, input().split()))
S = [[int(i) for i in list(eval(input()))] for _ in range(H)]
accum_col = [[0 for _ in range(W)] for _ in range(H)]
for i in range(H):
    for j in range(W):
        if i == 0:
            accum_col[i][j] = S[i][j]
        else:
            accum_col[i][j] = accum_col[i - 1][j] + S[i][j]


def cnt_white(x, a, b):
    if a == 0:
        return accum_col[b - 1][x]
    else:
        return accum_col[b - 1][x] - accum_col[a - 1][x]


ans = H * W
for bit in range(1 << (H - 1)):
    # 横に直線で割るが、その線の真下のindex
    horizs = [0]
    cnt_split = bin(bit).count("1")
    for i in range(H - 1):
        if bit & (1 << i):
            """
            i=0でbitに1が立っていると、y=0と1の間を横一直線に割るので、次のブロックの始まりはy=1から。
            みたいな意味でi+1
            """
            horizs.append(i + 1)
    horizs.append(H)
    # horizsの要素間がブロックなので-1
    # これまでの各ブロックの累積のホワイトチョコの個数
    prev = [0] * (len(horizs) - 1)
    for x in range(W):
        # 横位置でxの列の各ブロックのホワイトチョコの個数
        curr_col = [cnt_white(x, a, b) for a, b in zip(horizs, horizs[1:])]
        # 各ブロックの個数
        prev_curr = [curr_col[i] + prev[i] for i in range(len(horizs) - 1)]
        if max(curr_col) > K:
            # 一行だけみてもKを超えるブロックがあるので、十分大きい値を足してアウトにする
            cnt_split += H * W
            break
        if max(prev_curr) > K:
            # ホワイトチョコが最も多いブロックでKを超えていれば、手前の列までで割る
            prev = curr_col
            cnt_split += 1
        else:
            # いずれもK以下であればそのままブロックを広げる
            prev = prev_curr
    ans = min(ans, cnt_split)
print(ans)

H, W, K = list(map(int, input().split()))
S = [[int(i) for i in list(eval(input()))] for i in range(H)]
# 縦の累積ホワイトチョコ数
whites_col = [[0 for _ in range(W)] for _ in range(H)]
for w in range(W):
    for h in range(H):
        if h == 0:
            whites_col[h][w] = S[h][w]
        else:
            whites_col[h][w] = whites_col[h - 1][w] + S[h][w]
"""
マス目で考えると、縦Hマスある場合はH+1本の横線がある。
その横線の番号を渡して、その間にある数をとってくる
"""


def calc(w, a, b):
    if a == 0:
        return whites_col[b - 1][w]
    else:
        return whites_col[b - 1][w] - whites_col[a - 1][w]


ans = (H - 1) * (W - 1)
for bit in range(1 << (H - 1)):
    cnt_split = bin(bit).count("1")
    divs = [0]
    for i in range(H - 1):
        if bit & (1 << i):
            divs.append(i + 1)
    divs.append(H)
    curr = [0] * (len(divs) - 1)
    prev = [0] * (len(divs) - 1)
    over_K_in_curr = False
    for w in range(W):
        for i, (a, b) in enumerate(zip(divs, divs[1:])):
            curr[i] = calc(w, a, b)
        over_K_in_curr = False
        if max(curr) > K:
            over_K_in_curr = True
            break
        for i in range(len(divs) - 1):
            prev[i] += curr[i]
        if max(prev) > K:
            cnt_split += 1
            prev = curr[:]
    if not over_K_in_curr:
        ans = min(ans, cnt_split)
print(ans)

-S = [[int(i) for i in list(eval(input()))] for _ in range(H)] -accum_col = [[0 for _ in range(W)] for _ in range(H)] -for i in range(H): -    for j in range(W): -        if i == 0: -            accum_col[i][j] = S[i][j] +S = [[int(i) for i in list(eval(input()))] for i in range(H)] +# 縦の累積ホワイトチョコ数 +whites_col = [[0 for _ in range(W)] for _ in range(H)] +for w in range(W): +    for h in range(H): +        if h == 0: +            whites_col[h][w] = S[h][w] -            accum_col[i][j] = accum_col[i - 1][j] + S[i][j] +            whites_col[h][w] = whites_col[h - 1][w] + S[h][w] +""" +マス目で考えると、縦Hマスある場合はH+1本の横線がある。 +その横線の番号を渡して、その間にある数をとってくる +""" -def cnt_white(x, a, b): +def calc(w, a, b): -        return accum_col[b - 1][x] +        return whites_col[b - 1][w] -        return accum_col[b - 1][x] - accum_col[a - 1][x] +        return whites_col[b - 1][w] - whites_col[a - 1][w] -ans = H * W +ans = (H - 1) * (W - 1) -    # 横に直線で割るが、その線の真下のindex -    horizs = [0] +    divs = [0] -            """ -            i=0でbitに1が立っていると、y=0と1の間を横一直線に割るので、次のブロックの始まりはy=1から。 -            みたいな意味でi+1 -            """ -            horizs.append(i + 1) -    horizs.append(H) -    # horizsの要素間がブロックなので-1 -    # これまでの各ブロックの累積のホワイトチョコの個数 -    prev = [0] * (len(horizs) - 1) -    for x in range(W): -        # 横位置でxの列の各ブロックのホワイトチョコの個数 -        curr_col = [cnt_white(x, a, b) for a, b in zip(horizs, horizs[1:])] -        # 各ブロックの個数 -        prev_curr = [curr_col[i] + prev[i] for i in range(len(horizs) - 1)] -        if max(curr_col) > K: -            # 一行だけみてもKを超えるブロックがあるので、十分大きい値を足してアウトにする -            cnt_split += H * W +            divs.append(i + 1) +    divs.append(H) +    curr = [0] * (len(divs) - 1) +    prev = [0] * (len(divs) - 1) +    over_K_in_curr = False +    for w in range(W): +        for i, (a, b) in enumerate(zip(divs, divs[1:])): +            curr[i] = calc(w, a, b) +        over_K_in_curr = False +        if max(curr) > K: +            over_K_in_curr = True -        if max(prev_curr) > K: -            # ホワイトチョコが最も多いブロックでKを超えていれば、手前の列までで割る -            prev = curr_col +        for i in range(len(divs) - 1): +            prev[i] += curr[i] +        if max(prev) > K: -        else: -            # いずれもK以下であればそのままブロックを広げる -            prev = prev_curr -    ans = min(ans, cnt_split) +            prev = curr[:] +    if not over_K_in_curr: +        ans = min(ans, cnt_split)