本文共 2344 字,大约阅读时间需要 7 分钟。
为了解决这个问题,我们需要在网格地图上部署炮兵,使得任何两支炮兵之间不能互相攻击。攻击范围是横向左右各两格,纵向上下各两格。我们需要找到最多可以部署的炮兵数量。
import sysdef main(): N, M = map(int, sys.stdin.readline().split()) grid = [] for _ in range(N): line = sys.stdin.readline().strip() grid.append(line) # 状态的大小是 2^M max_state = 1 << M dp = [[0] * max_state for _ in range(N)] for row in range(N): for state_prev in range(max_state): current_count = dp[row][state_prev] if current_count == 0 and row == 0: continue for col in range(M): # 检查前一行的 col-1, col, col+1 是否被占用 conflict = False if col - 1 >= 0: if (state_prev >> (col - 1)) & 1: conflict = True if not conflict and (state_prev >> col) & 1: conflict = True if not conflict and col < M - 1: if (state_prev >> (col + 1)) & 1: conflict = True if conflict: continue # 可以放置炮兵,计算新的状态 new_state = state_prev if (new_state >> col) & 1: continue # 已经放置了炮兵 new_state |= (1 << col) new_count = current_count + 1 if new_count > dp[row + 1][new_state]: dp[row + 1][new_state] = new_count # 处理不放置炮兵的情况 for col in range(M): new_state = state_prev if (new_state >> col) & 1: continue new_count = current_count if new_count > dp[row + 1][new_state]: dp[row + 1][new_state] = new_count max_k = 0 for state in range(max_state): if dp[N][state] > max_k: max_k = dp[N][state] print(max_k)if __name__ == '__main__': main()
dp数组记录每行每个状态下的最大炮兵数量。通过这种方法,我们可以高效地解决问题,确保在防止误伤的前提下,部署最多的炮兵。
转载地址:http://kuxfk.baihongyu.com/