记忆化搜索——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));
    }
}

 

posted @ 2019-07-26 19:32  helman78  阅读(92)  评论(0编辑  收藏  举报