//记忆性搜索 //首先必须认识到这道题是一道搜索题目,用普通的dfs也可搞定,因为不需设置 //visited[]数组(前后判断的两数不可逆向重复搜索,有大小限制),故用dfs也 //可搜索最优解 //其次,这道题目可以用dp的record方法,进行记忆化,简化了很多搜索步骤 #include <iostream> using namespace std; int map[100][100]; int v[100][100]; int m, n; int Max = -1; int x[] = {0, 0, 1, -1}; int y[] = {1, -1, 0, 0}; bool isOK(int i, int j) { if(i < 0 || j <0 || i >= m || j >= n) return false; return true; } int dfs(int i, int j) { if(v[i][j]) return v[i][j]; //记忆点 如果以前找过了 就直接返回值 不在继续找 int max = 1; for(int k = 0; k < 4; ++k) { int tempA = i+x[k]; int tempB = j+y[k]; if(isOK(tempA, tempB) && map[i][j] < map[tempA][tempB]) { int temp = dfs(tempA, tempB); if(1+temp > max) max = 1+temp; } } v[i][j] = max; return v[i][j]; } int main() { scanf("%d%d", &m, &n); for(int i = 0; i < m; ++i) for(int j = 0; j < n; ++j) scanf("%d", &map[i][j]); for(int i = 0; i < m; ++i) for(int j = 0; j < n; ++j) { int ret = dfs(i, j); if(ret > Max) Max = ret; } printf("%d/n", Max); return 0; } http://acm.pku.edu.cn/JudgeOnline/problem?id=1088