import sys

i = 0
s = []
n, m = 0, 0
for line in sys.stdin:
    if i == 0:
        n, m = map(int, line.split())
    else:
        s.append(line[:-1])
    i += 1
val = {
    "r": 0,
    "e": 1,
    "d": 2
}
all_col = []
def check(a, b, n):
    for i in range(n):
        if a % 10 == b % 10:
            return False
        a //= 10
        b //= 10
    return True
def change_num(col, a):
    res = 0
    for i in range(len(col) - 1, -1, -1):
        if a % 10 != col[i]:
            res += 1
        a //= 10
    return res
def get_all_col(x, i, a):
    global all_col
    for j in range(3):
        if i == 1:
            a = j
            if i == x:
                all_col.append(a)
            else:
                get_all_col(x, i + 1, a)
        else:
            if a % 10 == j:
                continue
            else:
                b = a * 10 + j
                if i == x:
                    all_col.append(b)
                else:
                    get_all_col(x, i + 1, b)
get_all_col(n, 1, 0)
# print(all_col)
dp = [[0] * len(all_col) for _ in range(m)]

for i in range(m):
    for j in range(len(all_col)):
        col = [val[s[k][i]] for k in range(n)]
        if i == 0:
            dp[i][j] = change_num(col, all_col[j])
        else:
            for k in range(len(all_col)):
                if check(all_col[j], all_col[k], n):
                    dp[i][j] = min(dp[i][j], change_num(col, all_col[j]) + dp[i - 1][k]) if dp[i][j] != 0 else change_num(col, all_col[j]) + dp[i - 1][k]
res = dp[m - 1][0]
for i in range(len(all_col)):
    res = min(res, dp[m - 1][i])
print(res)


        
  • 首先获取每列可能的red组合情况,共pow(3,n)种,筛选出相邻元素不同的所有情况all_col,得到可能的情况数为len(all_col)
  • 按列动态规划,dp的维度为(m, len(all_col)),对于每列的每种情况,得到前一列的所有序列与当前列的某一序列a不冲突的序列最小值加上当前列的元素变为情况a的修改步数即为当前列变为序列a的最小步数