UVa 10285 Longest Run on a Snowboard【记忆化搜索】
题意:和最长滑雪路径一样,
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 #define mod=1e9+7; 12 using namespace std; 13 14 typedef long long LL; 15 const int maxn=105; 16 int g[maxn][maxn],vis[maxn][maxn],d[maxn][maxn]; 17 int dir[4][2]={-1,0,1,0,0,-1,0,1}; 18 int n,m; 19 20 int dfs(int x,int y){ 21 if(d[x][y]) return d[x][y];//如果已经搜过这一点,则直接返回,不用再重复计算 22 int ans=0; 23 for(int i=0;i<4;i++){ //四个 方向搜 24 int nx=x+dir[i][0]; 25 int ny=y+dir[i][1]; 26 if(nx<1||nx>n||ny<1||ny>m) continue;//越界 27 if(g[x][y]>g[nx][ny]) 28 ans=max(ans,1+dfs(nx,ny)); 29 } 30 31 if(ans==0) return d[x][y]=1; 32 return d[x][y]=ans; 33 } 34 35 int main(){ 36 int ncase,r,c; 37 char s[maxn]; 38 scanf("%d",&ncase); 39 while(ncase--){ 40 cin>>s; 41 cin>>n>>m; 42 43 for(int i=1;i<=n;i++) 44 for(int j=1;j<=m;j++) cin>>g[i][j]; 45 46 memset(d,0,sizeof(d)); 47 int tmp=0; 48 49 for(int i=1;i<=n;i++){ 50 for(int j=1;j<=m;j++) 51 tmp=max(tmp,dfs(i,j)); 52 } 53 printf("%s: %d\n",s,tmp); 54 } 55 return 0; 56 }
唉= =自己又敲一遍= =运行出来是错的,还对照着以前写的
真是挫爆了= =以后就算不会,也要自己敲一敲 加油--- go---go--go