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

题目链接: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 120

using 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;
}


你可能感兴趣的:([HDU 1078]FatMouse and Cheese(记忆化DFS))