1 5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
25
题解:题目让求滑雪最大距离,也就是最长递减长度;
暴力搜索下竟然就过了,也可以用记忆化搜索做时间短了好多。
dfs代码:
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<queue> using namespace std; const int INF=0xfffffff; #define mem(x,y) memset(x,y,sizeof(x)) #define SI(x) scanf("%d",&x) #define PI(x) printf("%d",x) typedef long long LL; const int MAXN=110; int ans; int mp[MAXN][MAXN]; int disx[4]={0,0,1,-1}; int disy[4]={1,-1,0,0}; int R,C; void dfs(int x,int y,int step){ ans=max(ans,step); for(int i=0;i<4;i++){ int nx=x+disx[i],ny=y+disy[i]; if(nx<0||nx>=R||ny<0||ny>=C)continue; if(mp[nx][ny]<mp[x][y])dfs(nx,ny,step+1); } } int main(){ int T; SI(T); while(T--){ scanf("%d%d",&R,&C); for(int i=0;i<R;i++) for(int j=0;j<C;j++) SI(mp[i][j]); ans=0; for(int i=0;i<R;i++) for(int j=0;j<C;j++) dfs(i,j,1); printf("%d\n",ans); } return 0; }
记忆化搜索:
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<queue> using namespace std; const int INF=0xfffffff; #define mem(x,y) memset(x,y,sizeof(x)) #define SI(x) scanf("%d",&x) #define PI(x) printf("%d",x) typedef long long LL; const int MAXN=110; int ans; int mp[MAXN][MAXN]; int disx[4]={0,0,1,-1}; int disy[4]={1,-1,0,0}; int dp[MAXN][MAXN]; int R,C; int dfs(int x,int y,int step){ if(dp[x][y])return dp[x][y]; int len=1,maxlen=1; for(int i=0;i<4;i++){ int nx=x+disx[i],ny=y+disy[i]; if(nx<0||nx>=R||ny<0||ny>=C)continue; if(mp[nx][ny]<mp[x][y])len=dfs(nx,ny,step+1)+1; maxlen=max(maxlen,len); } dp[x][y]=maxlen; return dp[x][y]; } int main(){ int T; SI(T); while(T--){ scanf("%d%d",&R,&C); for(int i=0;i<R;i++) for(int j=0;j<C;j++) SI(mp[i][j]); ans=0; mem(dp,0); for(int i=0;i<R;i++) for(int j=0;j<C;j++) ans=max(dfs(i,j,1),ans); printf("%d\n",ans); } return 0; }
原文:http://www.cnblogs.com/handsomecui/p/5232524.html