记忆化搜索——HDU - 1078
题目含义
给出n*n的地图和每次行走最长距离k,每次到达的数字必须大于原来的数字
问走一遍得到的数字最大是多少
题目分析
一个dfs就可以了
题目代码
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; typedef long long LL; const int maxn=1e5+7; int n,k; int mapp[107][107],dp[107][107]; int dir[4][2]={-1,0,1,0,0,1,0,-1}; int dfs(int x,int y){ if(dp[x][y]!=-1)return dp[x][y]; int maxx=0; for(int i=0;i<4;i++) for(int j=1;j<=k;j++){ int sx=x+dir[i][0]*j,sy=y+dir[i][1]*j; if(sx<0||sy<0||sx>=n||sy>=n||mapp[sx][sy]<=mapp[x][y])continue; int temp=dfs(sx,sy); maxx=max(maxx,temp); } return dp[x][y]=maxx+mapp[x][y]; } int main(){ while(scanf("%d%d",&n,&k)){ memset(dp,-1,sizeof(dp)); if(n==-1&&k==-1)return 0; for(int i=0;i<n;i++) for(int j=0;j<n;j++){ scanf("%d",&mapp[i][j]); } memset(dp,-1,sizeof(dp)); printf("%d\n",dfs(0,0)); } }