总结:
1、记忆化搜索,需要开一个新的数组,然后在新的递归之前,直接返回累加值;
#define max_n 20
int val[max_n][max_n] = {0};
int keep[max_n][max_n] = {0};
int dfs(int i, int j, int n) {
if (i + 1 ==n) return val[i][j];
if (keep[i][j]) return keep[i][j]; //在新的递归开始前,直接返回累加值,正是这个返回记录值,减少了递归的次数。
int val1 = dfs(i + 1, j, n);
int val2 = dfs(i + 1, j + 1, n);
return keep[i][j] = (val1 > val2 ? val1 : val2) + val[i][j]; //记忆化。
}
2、深度优先搜索的写法要记住,这是一种很简洁的写法。
#define max_n 20
int val[max_n][max_n] = {0};
int dfs(int i, int j, int n) {
if (i + 1 == n) return val[i][j];
int val1 = dfs(i + 1, j, n);
int val2 = dfs(i + 1, j + 1, n);
return (val1 > val2 ? val1 : val2) + val[i][j];
}
3、DFS(i, j, n)从位置(i,j)向下走n步的最大值;