赞
踩
滑雪
dfs做法(超时)
#include<iostream> #include<algorithm> using namespace std; const int N=310; int r,c; int h[N][N]; int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; int dfs(int x,int y) { int cnt=1; int max_cnt=0; for(int i=0;i<4;i++) { int a=x+dx[i]; int b=y+dy[i]; if(a<1||a>r||b<1||b>c||h[a][b]>=h[x][y]) continue; max_cnt=max(max_cnt,dfs(a,b)); } cnt+=max_cnt; return cnt; } int main() { cin>>r>>c; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) scanf("%d",&h[i][j]); int res=0; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) res=max(res,dfs(i,j)); cout<<res; return 0; }
记忆化搜索
使用数组记录每一个点的最大长度,然后检测该点四周的点 如果可以滑动到其他的点,那么该点的最大滑动长度 就是其他可以滑到的点的滑动长度+1,dp[i][j] = max(dp[i][j-1], dp[i][j+1],dp[i-1][j],dp[i+1][j])。
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=310; int r,c; int h[N][N]; int f[N][N]; int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; int dfs(int x,int y) //返回的是当前点的最大长度 { int &t=f[x][y]; //引用 if(t!=-1) return t; t=1; for(int i=0;i<4;i++) { int a=x+dx[i]; int b=y+dy[i]; if(a<1||a>r||b<1||b>c||h[a][b]>=h[x][y]) continue; t=max(t,dfs(a,b)+1); } return t; } int main() { cin>>r>>c; memset(f,-1,sizeof f); for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) scanf("%d",&h[i][j]); int res=0; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) res=max(res,dfs(i,j)); cout<<res; return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。