poj1088 滑雪问题

这题刚开始我想到的是搜索,但是超时了,所以要进行优化,听说这是dp经典题,当时就疯了,dp才初学,想到的是

dp[i,j]=max(dp[四个方向]);

 lyon大神说不用递归,但是我可耻的递归了,哎~

但写出来不太理想,主要是不懂的递归间数值的变化,导致一直出不来答案!

后来看题解啊,改啊,搞啊,许久才出来个能a的代码,并且还0ms了,看来还得多熟悉下 

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<stdlib.h>
 5 #define INF     0x3f3f3f3f
 6 #define Maxin 10000
 7 int f[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
 8 int map[110][110];
 9 int v[110][110];    
10 int r,c,x,y;
11 int dfs(int i,int j)
12 {
13     if(v[i][j]!=1)
14         return v[i][j];//加了这个才没超时,为了防止重复计算的
15     for(int z=0;z<4;z++)
16     {
17         int a=i+f[z][0];
18         int b=j+f[z][1];
19         if(a>=0&&a<r&&b>=0&&b<c
20             &&map[a][b]>map[i][j])//四方向探索,满足a b在图内,且高度满足条件
21         {
22             int k=dfs(a,b);//求出a b的最大长度
23             if(v[i][j]<k+1)
24               v[i][j]=k+1;//i j的最大长度是a b的长度+1
25         }
26     }
27         return v[i][j];
28 }
29 int main()
30 {
31     int max=0;
32     scanf("%d%d",&r,&c);
33     for(int b=0;b<r;b++)
34         for(int c1=0;c1<c;c1++)
35             v[b][c1]=1;//初始化v记录数组
36 
37     for(x=0;x<r;x++)
38         for(y=0;y<c;y++)
39             scanf("%d",&map[x][y]);
40         for(x=0;x<r;x++)
41             for(y=0;y<c;y++)
42                 if(v[x][y]==1)
43                    dfs(x,y);
44 
45         for(x=0;x<r;x++)
46         {
47             for(y=0;y<c;y++)
48             {
49                if(v[x][y]>max)
50                    max=v[x][y];
51              //  printf("%d ",v[x][y]);
52             }
53         //    printf("\n");
54         }
55             printf("%d\n",max);
56     return 0;
57 }

posted on 2012-05-11 13:55  usp10  阅读(115)  评论(0编辑  收藏  举报

导航