POJ 1088 滑雪 记忆化优化题解
本题有人写是DP,只是和DP还是有点区别的,应该主要是记忆化 Momoization 算法。
思路就是递归,然后在递归的过程把计算的结果记录起来,以便后面使用。
非常经典的搜索题目,这样的方法非常多题目考到的。
关键还是怎样把代码写清晰工整了,O(∩_∩)O~。
#include <stdio.h> const int MAX_N = 101; int R, C; int arr[MAX_N][MAX_N]; int tbl[MAX_N][MAX_N]; inline int max(int a, int b) { return a > b ? a : b ; } inline bool isLegal(int r, int c, int r1, int c1) { return 0<=r1 && 0<=c1 && r1<R && c1<C && arr[r][c] < arr[r1][c1]; } int getMaxStair(int r, int c) { if (tbl[r][c]) return tbl[r][c]; int up = isLegal(r, c, r+1, c)? getMaxStair(r+1, c) : 0; int down = isLegal(r, c, r-1, c)? getMaxStair(r-1, c) : 0; int left = isLegal(r, c, r, c-1)? getMaxStair(r, c-1) : 0; int right = isLegal(r, c, r, c+1)? getMaxStair(r, c+1) : 0; return tbl[r][c] = max(max(up, down), max(left, right)) + 1; } int getMaxStairNum() { int ans = 0; for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { getMaxStair(i, j); } } for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { ans = max(ans, tbl[i][j]); } } return ans; } int main() { while (scanf("%d %d", &R, &C) != EOF) { for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { scanf("%d", &arr[i][j]); tbl[i][j] = 0; } } printf("%d\n", getMaxStairNum()); } return 0; }