ABC 147 E - Balanced Path【Python】

問題はこちら

ループが80^4 = 4 * 10^7くらいになってpythonじゃ間に合わなかったのでC++で通した。皆の回答を見たらPythonでも結構通してる人がいて、その多くがbit演算を使った高速化を用いていた。自分も使えるようになりたくてbit演算を用いて高速化したpythonコードを書いたので載せておく。

import sys
readline = sys.stdin.readline
readlines = sys.stdin.readlines


def main():
   zero = 6400
   H, W = map(int, readline().split())
   A = [list(map(int, readline().split())) for _ in range(H)]
   B = [list(map(int, readline().split())) for _ in range(H)]
   
   dp = [[0] * (W + 1) for _ in range(H + 1)]
   dp[1][0] |= 1 << zero
   dp[0][1] |= 1 << zero
   for h in range(H):
       for w in range(W):
           d = abs(A[h][w] - B[h][w])
           dp[h + 1][w + 1] |= (dp[h + 1][w] << d) | (dp[h + 1][w] >> d)
           dp[h + 1][w + 1] |= (dp[h][w + 1] << d) | (dp[h][w + 1] >> d)
   last = dp[-1][-1]
   ans = zero
   i = -zero
   while last > 0:
       if last & 1:
           ans = min(ans, abs(i))
       i += 1
       last >>= 1
   print(ans)


if __name__ == '__main__':
   main()

この記事が気に入ったらサポートをしてみませんか?