本文共 3151 字,大约阅读时间需要 10 分钟。
为了解决这个问题,我们需要在给定的网格地图上部署尽可能多的炮兵部队,同时确保任何两支炮兵部队之间不能互相攻击。攻击范围是每个炮兵部队横向和纵向各两格,包括其所在的位置。
dp[i][mask]表示在第i行,当前行的状态是mask时的最大炮兵数目。mask,检查它是否与上一行的状态prev_mask有任何攻击范围的重叠。如果没有重叠,则更新当前行的状态。mask允许的上一行的状态prev_mask,以避免在动态规划中进行费时的冲突检查。import sysfrom sys import stdindef main(): n, m = map(int, stdin.readline().split()) grid = [] for _ in range(n): line = stdin.readline().strip() grid.append(line) # 预处理attak_matrix attak_matrix = [[False for _ in range(m)] for _ in range(m)] for x in range(m): for y in range(m): if (x == y + 1 and x != y) or (y == x + 1 and y != x): attak_matrix[x][y] = True elif (x == y - 1 and x != y) or (y == x - 1 and y != x): attak_matrix[x][y] = True # 预处理allowed_masks allowed_masks = [set() for _ in range(1 << m)] for current_mask in range(1 << m): current_attack = 0 for x in range(m): if (current_mask >> x) & 1: current_attack |= (1 << x) for prev_mask in range(1 << m): prev_attack = 0 for y in range(m): if (prev_mask >> y) & 1: prev_attack |= (1 << y) conflict = False for x in range(m): if (current_mask >> x) & 1: for y in range(m): if (prev_mask >> y) & 1 and attak_matrix[x][y]: conflict = True break if conflict: break if not conflict: allowed_masks[current_mask].add(prev_mask) # 初始化动态规划 dp = [ [-1 for _ in range(1 << m)] for _ in range(n+1)] dp[0][0] = 0 for i in range(1, n+1): for current_mask in range(1 << m): # 检查当前mask是否有炮兵在H的位置 valid = True for x in range(m): if (current_mask >> x) & 1 and grid[i-1][x] == 'H': valid = False break if not valid: continue current_count = bin(current_mask).count('1') max_prev = 0 for prev_mask in allowed_masks[current_mask]: if dp[i-1][prev_mask] != -1: if dp[i-1][prev_mask] + current_count > max_prev: max_prev = dp[i-1][prev_mask] + current_count if max_prev > 0: dp[i][current_mask] = max_prev else: dp[i][current_mask] = current_count if current_count > 0 else 0 max_result = 0 for mask in range(1 << m): if dp[n][mask] > max_result: max_result = dp[n][mask] print(max_result)if __name__ == "__main__": main() attak_matrix,记录每个位置之间是否在攻击范围内。mask允许的上一行的状态prev_mask,以避免在动态规划中进行费时的冲突检查。dp,并逐步计算每一行的状态,确保每一行的状态与上一行的状态不冲突。转载地址:http://qwvzz.baihongyu.com/