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 }
View Code

 

 

 

 

 

 

 

 

 

 

 

 

唉= =自己又敲一遍= =运行出来是错的,还对照着以前写的

真是挫爆了= =以后就算不会,也要自己敲一敲 加油--- go---go--go

你可能感兴趣的:(long)