poj1088 滑雪问题 dp写法
今早写了个滑雪的dfs,被大神说学不会dp,我就看了下他的题解,发现给了提示后想想还真的可以这样写,大神博客连接给出:http://www.cnblogs.com/LyonLys/archive/2012/04/27/poj_1088_Lyon.html
如他的提示,先对高度排个降序,然后就从最低的开始dp他,找到一个比他小的就自己+1,当然要先跟自己本身对比下才更新。然后就a了,但是怎么时间那么慢啊,要32ms,dfs那个0ms,这个可是线性的。。表示不懂。。。
做了下测试,发现是服务器问题,今早0ms,现在32ms。
10185504 | liang19925 | 1088 | Accepted | 304K | 32MS | C++ | 1185B | 2012-05-12 00:37:31 |
View Code
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 dps[15000],d=0; 11 int r,c,x,y; 12 int cmp(const void*x,const void*y) 13 { 14 int i=*(int*)x; 15 int j=*(int*)y; 16 return map[i/r][i%r]-map[j/r][j%r]; 17 } 18 int dp(int q) 19 { 20 21 int i=q/r; 22 int j=q%r; 23 for(int z=0;z<4;z++) 24 { 25 int a=i+f[z][0]; 26 int b=j+f[z][1]; 27 if(a>=0&&a<r&&b>=0&&b<c 28 &&map[a][b]<map[i][j])//四方向探索,满足a b在图内,且高度满足条件 29 { 30 if(v[i][j]<v[a][b]+1) 31 v[i][j]=v[a][b]+1;//i j的最大长度是a b的长度+1 32 } 33 } 34 return 0; 35 } 36 int main() 37 { 38 int max=0; 39 scanf("%d%d",&r,&c); 40 for(int b=0;b<r;b++) 41 for(int c1=0;c1<c;c1++) 42 v[b][c1]=1;//初始化v记录数组 43 44 for(x=0;x<r;x++) 45 for(y=0;y<c;y++) 46 { 47 scanf("%d",&map[x][y]); 48 dps[d++]=r*x+y; 49 50 } 51 52 qsort(dps,r*c,sizeof(int),cmp); 53 54 for(x=1;x<r*c;x++) 55 dp(dps[x]); 56 57 for(x=0;x<r;x++) 58 { 59 for(y=0;y<c;y++) 60 { 61 if(v[x][y]>max) 62 max=v[x][y]; 63 // printf("%d ",v[x][y]); 64 } 65 // printf("\n"); 66 } 67 printf("%d\n",max); 68 return 0; 69 }