POJ1088(滑雪)

求滑行最长的长度,动态规划加记忆化

#include<stdio.h>

int m,n,MAX=0;
struct Node
{
  int height;
  int visit;
  int len;
}node[105][105];

int max4(int a,int b,int c,int d)
{
    if(a<b)a=b;
    if(a<c)a=c;
    if(a<d)a=d;
    return a;
}

int dp(int x,int y)
{
    int r,l,d,t,M;
    if(node[x][y].visit)return node[x][y].len;
    if(node[x][y].height<=node[x-1][y].height&&node[x][y].height<=node[x+1][y].height&&node[x][y].height<=node[x][y+1].height&&node[x][y].height<=node[x][y-1].height)
    {
        node[x][y].len=1;
        node[x][y].visit=1;
        return 1;
    }
    if(x+1<=m&&node[x][y].height>node[x+1][y].height)
    {
        d=1+dp(x+1,y);
    }
    else
    d=1;
    if(x-1>0&&node[x][y].height>node[x-1][y].height)
    {
        t=1+dp(x-1,y);
    }
    else
    t=1;
    if(y+1<=n&&node[x][y].height>node[x][y+1].height)
    {
        r=1+dp(x,y+1);
    }
    else
    r=1;
    if(y-1>0&&node[x][y].height>node[x][y-1].height)
    {
        l=1+dp(x,y-1);
    }
    else
    l=1;
    M=max4(r,l,d,t);
    node[x][y].visit=1;
    node[x][y].len=M;
    return M;
}

int main()
{
    int i,j,MAX;
    scanf("%d%d",&m,&n);
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=n;j++)
        {
            scanf("%d",&node[i][j].height);
            node[i][j].len=0;
            node[i][j].visit=0;
        }
    }
    for(i=0;i<=m+1;i++)
    {
        node[i][0].height=10001;
        node[i][n+1].height=10001;
    }
    for(i=0;i<=n+1;i++)
    {
        node[0][i].height=10001;
        node[m+1][i].height=10001;
    }
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=n;j++)
        {
            dp(i,j);
        }
    }
    MAX=0;
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(MAX<node[i][j].len)
            MAX=node[i][j].len;
        }
    }
    printf("%d\n",MAX);
    return 0;
}

posted @ 2013-03-22 17:25  algorithms爱好者  阅读(119)  评论(0)    收藏  举报