poj1088——滑雪

来源:互联网 发布:数据训练模型 编辑:程序博客网 时间:2024/04/30 04:12

题目大意:一个人在一个滑坡区域内滑雪,只能向下斜坡滑,问最长滑坡的长度

输入:区域行数R  区域列数C(1 <= R,C <= 100)

           二维数组R*C(每个数字代表点的高度h)(0<=h<=10000

输出:最长滑坡的长度

分析:dfs+记忆化(这道题dp也可以,其实思路都一样)

           从每一个点出发,dfs所能到达的最远路径,从这些点中选出长度最长的。区域中最矮的点,长度肯定为1。

代码:转载自https://www.cnblogs.com/pushing-my-way/archive/2012/07/22/2603465.html

 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5  6 const int maxnum=101; 7 int array[maxnum][maxnum]; 8 int res[maxnum][maxnum]; 9 int r,c;10 int lx[4]={-1,1,0,0};11 int ly[4]={0,0,-1,1};12 13 bool judge(int x,int y)14 {15     if(x>=1 && x<=r && y>=1 && y<=c)16         return true;17     else return false;18 }19 20 int dfs(int x,int y)21 {22     if(res[x][y]!=0) return res[x][y];23     int i;24     int big=0;25     for(i=0;i<4;i++)26         if(judge(x+lx[i],y+ly[i]) && array[x+lx[i]][y+ly[i]]<array[x][y])27         {28             res[x+lx[i]][y+ly[i]]=dfs(x+lx[i],y+ly[i]);29             if(big<res[x+lx[i]][y+ly[i]])30                 big=res[x+lx[i]][y+ly[i]];31         }32     if(big>0) return big+1;33     return 1;   //big==0 表示走到死胡同里了。34     //return 0 表示各个点中到最小点的距离。35 }36 37 int main()38 {39     scanf("%d%d",&r,&c);40     int i,j;41     int small,si,sj;42     small=10005;43     memset(res,0,sizeof(res));44     memset(array,0,sizeof(array));45     for(i=1;i<=r;i++)46         for(j=1;j<=c;j++)47         {48             scanf("%d",&array[i][j]);49             if(array[i][j]<small)50             {51                 small=array[i][j];52                 si=i;53                 sj=j;54             }55         }56 57     res[si][sj]=1;58     for(i=1;i<=r;i++)59         for(j=1;j<=c;j++)60             res[i][j]=dfs(i,j);61 62     int ans=0;63     for(i=1;i<=r;i++)64         for(j=1;j<=c;j++)65             if(res[i][j]>ans)66                 ans=res[i][j];67     printf("%d\n",ans);68     return 0;69 }

原创粉丝点击