[HDU 1078]FatMouse and Cheese(记忆化DFS)

来源:互联网 发布:淘宝网电风扇 编辑:程序博客网 时间:2024/04/29 06:41

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078

题目大意:一个胖老鼠要在一个n*n大小的棋盘里吃奶酪,这个老鼠每一步最多能走k单位远,而且每走一步,必须走到比当前点奶酪数多的点那去。告诉你这个棋盘里每个点上的奶酪个数,求这个老鼠最多能吃多少奶酪。

思路:类似于棋盘DP的记忆化DFS,直接搜加记忆答案就可以了。

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#define MAXN 120using namespace std;int map[MAXN][MAXN];int f[MAXN][MAXN];int xx[]={1,-1,0,0},yy[]={0,0,1,-1};int n,k;int max(int a,int b){    if(a>b) return a;    return b;}bool inMap(int x,int y){    if(x<1||x>n||y<1||y>n) return false;    return true;}int dfs(int x,int y){    if(f[x][y]) return f[x][y];    int ans=0;    for(int dist=1;dist<=k;dist++)        for(int dir=0;dir<4;dir++)        {            int newx=x+xx[dir]*dist,newy=y+yy[dir]*dist;            if(inMap(newx,newy))                if(map[newx][newy]>map[x][y])                    ans=max(ans,dfs(newx,newy));        }    ans+=map[x][y];    return f[x][y]=ans;}int main(){    while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1)    {        memset(f,0,sizeof(f));        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                scanf("%d",&map[i][j]);        printf("%d\n",dfs(1,1));    }    return 0;}


0 0