给你一个 n*n 的字符矩阵(a-z),从左上走到右下,只能向右或下方移动,最多能变换 k 次字符(可以变为 a-z 任意字符),要求输出变换后的从起点到终点字典序最小的路径。
第一行 2 个数:n 和 k,对应矩阵的大小以及可以变换字符的次数。(1 <= n <= 2000,k <= n^2)
后面 n 行:每行 n 个字符(a-z),对应矩阵里的字符。
输出字典序最小的路径(一个长度为 2n-1 的字符串)。
路径长度固定为 2n-1。为了让字典序最小,应尽量让靠前的字符变成 'a'。
先做一次 DP:设 f[i][j] 表示走到 (i,j) 且路径上全部变成 'a' 所需的最少修改次数,则
f[i][j] = min(f[i-1][j], f[i][j-1]) + (c[i][j] != 'a')
找到满足 f[i][j] <= k 的最大对角线 d = i+j,这条对角线上的格子就是"全 a 前缀"可以到达的最远位置。之后不再使用修改机会,从这些格子出发逐层向右/向下扩展,每一层只保留字典序最小的字符,复杂度 O(n^2)。