POJ1088 滑雪

    原题链接:http://poj.org/problem?id=1088

    动态规划,记忆化搜索。

View Code
#include <cstdio>
#include <cstring>
#define MAXN 105
#define max(x,y) x > y ? x : y

int a[MAXN][MAXN], dp[MAXN][MAXN];
int dr[4][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};
int R, C;

int DP(int r, int c)
{
    if(dp[r][c] != -1)
    {
        return dp[r][c];
    }
    dp[r][c] = 1; //initialize
    for(int i = 0; i < 4; i ++)
    {
        int rr = r + dr[i][0];
        int cc = c + dr[i][1];
        if(rr < 1 || rr > R || cc < 1 || cc > C)
            continue;
        if(a[rr][cc] < a[r][c])
            dp[r][c] = max(dp[r][c], DP(rr, cc) + 1);
    }
    return dp[r][c];
}

void skiing()
{
    memset(dp, -1, sizeof(dp));
    for(int r = 1; r <= R; r ++)
    {
        for(int c = 1; c <= C; c ++)
        {
            dp[r][c] = DP(r, c);
        }
    }
}

int main()
{
    while(~scanf("%d%d", &R, &C))
    {
        for(int i = 1; i <= R; i ++)
        {
            for(int j = 1; j <= C; j ++)
            {
                scanf("%d", &a[i][j]);
            }
        }
        skiing();
        int max = 0;
        for(int i = 1; i <= R; i ++)
        {
            for(int j = 1; j <= C; j ++)
            {
                if(dp[i][j] > max)
                    max = dp[i][j];
            }
        }
        printf("%d\n", max);
    }
    return 0;
}
posted @ 2012-09-03 14:45  芒果布丁  阅读(139)  评论(0编辑  收藏  举报