POJ 1088 递归+记忆化搜索

来源:互联网 发布:从底层看java中的接口 编辑:程序博客网 时间:2024/05/18 22:16
题目要求: 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。求可以滑落的最长长度。

思路:记忆搜索水题

代码:

#include <iostream>#include <cstdio>#include <math.h>#include <cstring>using namespace std;const int maxn = 105;const int INF = 0x7fffffff;int a[maxn][maxn];int n, m, p, ans = 0;bool f = false;int xd[] = {1, -1, 0, 0};int yd[] = {0, 0, -1, 1};int dp[maxn][maxn] = {0};int dfs(int x, int y){    if (dp[x][y] != 0) {        return dp[x][y];    }    dp[x][y] = 1;    for (int i = 0; i < 4; ++i) {        int mx = xd[i] + x;        int my = yd[i] + y;        if (mx > 0 && my > 0 && mx <= n && my <= m && a[x][y] > a[mx][my]) {            dp[x][y] = max(dp[x][y], dfs(mx, my) + 1);        }    }    ans = max(dp[x][y], ans);    return dp[x][y];}int solve(){    for(int i = 1; i <= n; ++i) {        for (int j = 1; j <= m; ++j) {            cin >> a[i][j];        }    }    memset(dp, 0, sizeof(dp));    for (int i = 1; i <= n; ++i) {        for (int j = 1; j <= m; ++j) {            dfs(i, j);        }    }    cout << ans << endl;    return 0;}int main(){    while (scanf("%d%d", &n, &m) != EOF) {        solve();    }    return 0;}


0 0
原创粉丝点击