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 }