jefuo
@jefuo (arai ryota)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

atcoder のbit全探索「おせんべい」 何が間違っているのか分からないです

解決したいこと

こちらの問題についてコードを書いたのですが、一つのテストケースに合格せず何が悪いのかわかりません。

from itertools import product
N,M = map(int,input().split())
A = [[int(i)for i in input().split()]for _ in range(N)]
ans = 0
for bit in product((0,1),repeat=N):
    tmp = 0
    for i in range(N):
        if bit[i]:
            A[i]=[1 if v==0 else 0 for v in A[i]]
    B = list(zip(*A))
    for v in B:
        tmp += max(N-sum(v),sum(v))
    ans = max(ans,tmp)
print(ans)

発生している問題・エラー

bit全探索で行の0、1入れ替えたのち、B=list(zip(*A))で列を連結して0の個数と1の個数のうち大きい方を取って最後にansに最大値を更新しています
スクリーンショット (30).png

0

1Answer

毎回Aの値が更新されているのが問題のようです。
元の状態から1の時だけひっくり返すような処理にするために、ひとつ変数を追加して毎回Aをコピーしてから探索することでACとなることが確認できました。

from itertools import product
N,M = map(int,input().split())
A = [[int(i)for i in input().split()]for _ in range(N)]
ans = 0
for bit in product((0,1),repeat=N):
    tmp = 0
    tmpA = A.copy()
    for i in range(N):
        if bit[i]:
            tmpA[i]=[1 if v==0 else 0 for v in A[i]]
    B = list(zip(*tmpA))
    for v in B:
        tmp += max(N-sum(v),sum(v))
    ans = max(ans,tmp)
print(ans)
1Like

Comments

  1. @jefuo

    Questioner

    なるほどそういうことでしたか・・・自分もまだまだですね
    お力添え本当にありがとうございます!

Your answer might help someone💌