uva10285 - Longest Run on a Snowboard(动规,记忆化搜索)

由于题目没有说明起点和终点,所以我们要对终点或起点遍历每一个位置,

空间换时间,用dp数组记录已经搜索过的结果。

代码如下:

#include <cstdio>
#include <cstring>
#define N 105
char name[30];
int m, n, d[N][N], a[N][N], dirx[4] = {-1, 1, 0, 0},
                      diry[4] = {0 , 0,-1, 1};
int dp(int x, int y)
{
    int &ans = d[x][y];
    if(ans>0) return ans;
    ans = 1;
    for(int i = 0; i < 4; i++)
    {
        int nx = x+dirx[i], ny = y+diry[i];
        if(nx>=0&&nx<m&&ny>=0&&ny<n&&a[nx][ny]<a[x][y])
        ans = ans>dp(nx,ny)+1?ans:dp(nx,ny)+1;
    }
    return ans;
}
int main ()
{
    int cas;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%s %d %d",name, &m, &n);
        for(int i = 0; i < m; i++)
        for(int j = 0; j < n; j++)
        scanf("%d",&a[i][j]);
        memset(d,0,sizeof(d));
        int ans = 0;
        for(int i = 0; i < m; i++)
        for(int j = 0; j < n; j++)
        {
            int t = dp(i,j);
            ans = ans>t?ans:t;
        }
        printf("%s: %d\n",name,ans);
    }
    return 0;
}


 

你可能感兴趣的:(uva10285 - Longest Run on a Snowboard(动规,记忆化搜索))