第一行有一个正整数
(
),表示了有
组数据。
对于每一组数据,第一行有两个正整数
(
),表示了数字矩阵为
行
列。
接下来
行,每行
个非负整数,描述了这个数字矩阵,满足
。
输出共
行,每行一个非负整数,输出所求得的答案。
1 3 3 1 1 1 1 1 1 1 1 1
4
def solve():
n, m = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(n)]
# 1. Precompute all masks that are valid within a single row
valid_masks = []
for mask in range(1 << m):
if not (mask & (mask << 1)):
valid_masks.append(mask)
memo = {}
def dp(row_idx, prev_mask):
if row_idx == n:
return 0
state = (row_idx, prev_mask)
if state in memo: return memo[state]
res = 0
for curr_mask in valid_masks:
# 2. Check compatibility with the PREVIOUS row (8-neighbors)
# Vertical check
if (curr_mask & prev_mask): continue
# Diagonal checks
if (curr_mask & (prev_mask << 1)): continue
if (curr_mask & (prev_mask >> 1)): continue
# 3. Calculate sum for this row configuration
current_row_sum = 0
for i in range(m):
if (curr_mask >> i) & 1:
current_row_sum += grid[row_idx][i]
# Recurse to next row
res = max(res, current_row_sum + dp(row_idx + 1, curr_mask))
memo[state] = res
return res
# Start at row 0 with a '0' mask for the non-existent row -1
print(dp(0, 0))
for _ in range(int(input())):
solve()