HDU 1078 FatMouse and Cheese(记忆化搜索)

题意:输入n,k 表示方格的长宽为n,每次能够走的最大格子为k,然后输入n行n列个数,起点在(0,0),每次可以上下左右移动,每次移动的格子要比当前格子数目大,而且移动的单位不能超过k,求最后能够得到的最大值。

分析:从起点开始搜,搜索那些点可以走,然后找最大值(记忆化搜索)

#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stack>
#include <algorithm>

using namespace std;

const int maxn = 105;

int num[maxn][maxn];
int dp[maxn][maxn];
int n;
int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};

int DFS(int x, int y, int k)
{
    if(dp[x][y]!=-1)
        return dp[x][y];
    int Max = 0;
    for(int i=0; i<4; i++)
    {
        for(int kk=1; kk<=k; kk++)
        {
            int xx = x+dir[i][0]*kk;
            int yy = y+dir[i][1]*kk;
            if(xx<1||xx>n||yy<1||yy>n)
                continue;
            if(num[xx][yy]<=num[x][y])
                continue;
            Max = max(Max, DFS(xx, yy, k));
        }
    }
    dp[x][y] = Max+num[x][y];
    return dp[x][y];
}

int main()
{
    int k;
    while(scanf("%d%d", &n, &k))
    {
        if(n==-1&&k==-1)
            break;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                scanf("%d", &num[i][j]);
            }
        }
        memset(dp, -1, sizeof(dp));
        int ans = DFS(1,1,k);
        printf("%d
", ans);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/mengzhong/p/5436429.html