poj 1088 滑雪

来源:互联网 发布:淘宝法国灰太太正品吗 编辑:程序博客网 时间:2024/05/01 12:25

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

题目描述:给一个二维数组,从任意点开始,求其中最长的递减的序列的长度(四个方向)。。(不知道没写的人能不能看懂)

解题思路:做之前已经明确是DP的题目了。。然后就想到某点的最大值应该等于它附近点中最大的值加一,然后对地图中的点进行遍历,记忆化搜索,把值存到一个数组里,最后从数组中找到最大值就可以了。

AC代码:

#include<stdio.h>

#include<string.h>

int mm[105][105],r,c;

int len[105][105],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0},vis[105][105];

int dp(int i,int j)

{

   int max=0,n,m,l;

   if(vis[i][j])return len[i][j];

   else {

       for(n=0;n<4;n++){

           m=mm[i][j]-mm[i+dx[n]][j+dy[n]];//printf("%d",n);

           if(m<=0||i+dx[n]<0||i+dx[n]>=r||j+dy[n]<0||j+dy[n]>=c)continue;

           l=dp(i+dx[n],j+dy[n]);

           if(1+l>max)max=1+l;

       }

       len[i][j]=max;

       vis[i][j]=1;

       return max;

    }

}

int main()

{

   memset(vis,0,sizeof(vis));

   memset(len,0,sizeof(len));

   scanf("%d%d",&r,&c);

   int i,j,max=0;

   for(i=0;i<r;i++)

       for(j=0;j<c;j++)

       scanf("%d",&mm[i][j]);

   for(i=0;i<r;i++)

       for(j=0;j<c;j++)

       {

           len[i][j]=dp(i,j);

           //printf("%d %d %d\n",i,j,len[i][j]+1);

           if(len[i][j]>max)max=len[i][j];

       }

       printf("%d",max+1);

   return 0;

}

其实vis数组在改改之后就可以不用了。。

然后题意理解错了,导致WA了两发。。幸好不是一个人在战斗。。以后得注意。。

AC截图:

我记得我们同学给我提交的时候是0ms来着。。。人品问题还是啥。。

0 0
原创粉丝点击