首页 > 代码库 > vj1011:记忆化搜索
vj1011:记忆化搜索
vj1011:记忆化搜索
这题就是很简单的记忆化搜索即可,和经典题目滑雪简直一模一样
对于记忆化搜索,我也是暑假看了ccy大神的题解才有所领悟的
其实也就是DFS+mark
主要的部分
int search(int x,int y){ if(f[x][y]>0) return f[x][y]; int ans=0; int xx,yy; for(int i=0;i<4;i++){ xx=x+dx[i]; yy=y+dy[i]; if(xx>0 && xx<=n && yy>0 && yy<=m && a[x][y]>a[xx][yy]){ ans=max(ans,search(xx,yy)); } } return f[x][y]=ans+1; }
恩..其实也说不出来记忆化搜索这类题目的技巧吧...多感受
码起来挺简单的:
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <queue>#include <algorithm>#include <cmath>using namespace std;const int dx[5]={0,0,1,-1},dy[5]={1,-1,0,0};int a[501][501],f[501][501];int h,n,m,maxn=0,ans;int max(int a,int b){ return a>b?a:b;}int search(int x,int y){ if(f[x][y]>0) return f[x][y]; int ans=0; int xx,yy; for(int i=0;i<4;i++){ xx=x+dx[i]; yy=y+dy[i]; if(xx>0 && xx<=n && yy>0 && yy<=m && a[x][y]>a[xx][yy]){ ans=max(ans,search(xx,yy)); } } return f[x][y]=ans+1; }int main(){ memset(f,-1,sizeof(f)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j]; ans=-1; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(f[i][j]==-1) ans=max(ans,search(i,j)); } printf("%d\n",ans); return 0;}
vj1011:记忆化搜索
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。