矩阵深度优先搜索里的回溯(backtracking)常常是必要的,由于这类题目通常要求每个元素只能使用1次,因此我们需要维护一个seen矩阵(记录访问过的元素,并且在dfs压栈和退栈的时候反复设置状态),而每次选定的起始位置不同,seen的状态就不一样了,导致计算的结果不可重用(因为计算结果只代表在seen的某一种确定状态下的结果,所以我们不能进行缓存)。
最终,我们只能采用回溯的方式去求解,得到的时间复杂度正是指数级别。比如经典的Word Search II,不管我们使用不使用字典树(Trie),回溯是不可避免的。
leetcode题329的每个元素只能用1次的条件是隐含的——因为要求(严格)递增路径,所以有效路径里,同一个位置的元素是不可能出现两次的。然而递增路径带来的buff却不止前面前面这个隐含条件。因为在内循环里,mat[ii][jj] > mat[i][j]确保了之前已经访问过的元素根本就不会出现在后续的路径里,所以seen就没有存在的意义,甚至可以直接缓存每一个子调用的计算结果,因为不管你从哪个位置开始迭代,因为没有状态(没有seen),计算结果变成唯一的了——因此变得可以缓存了。