首页 > 代码库 > POJ 1088 滑雪 记忆化优化题解
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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。