HDU-1078 FatMouse and Cheese

时间限制 1000ms 空间限制 32768KB

题目:

FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension n: each grid location is labelled (p,q) where 0 <= p < n and 0 <= q < n. At each grid location Fatmouse has hid between 0 and 100 blocks of cheese in a hole. Now he's going to enjoy his favorite food.

FatMouse begins by standing at location (0,0). He eats up the cheese where he stands and then runs either horizontally or vertically to another location. The problem is that there is a super Cat named Top Killer sitting near his hole, so each time he can run at most k locations to get into the hole before being caught by Top Killer. What is worse -- after eating up the cheese at one location, FatMouse gets fatter. So in order to gain enough energy for his next run, he has to run to a location which have more blocks of cheese than those that were at the current hole.

Given n, k, and the number of blocks of cheese at each grid location, compute the maximum amount of cheese FatMouse can eat before being unable to move.

输入:

There are several test cases. Each test case consists of

a line containing two integers between 1 and 100: n and k
n lines, each with n numbers: the first line contains the number of blocks of cheese at locations (0,0) (0,1) ... (0,n-1); the next line contains the number of blocks of cheese at locations (1,0), (1,1), ... (1,n-1), and so on.
The input ends with a pair of -1's.

输出:

For each test case output in a line the single integer giving the number of blocks of cheese collected.

样例输入:

3 1

1 2 5

10 11 6

12 12 7

-1 -1

样例输出:

37

题意:

给出一个n,这里有一个n*n的地图,每一个点都有奶酪值,奶酪值得大小表示奶酪得多少,现在有一只老鼠站在(1,1)这个位置,给定一个k,代表它可以一次向着一个方向走1到k步,要使得他每次走的地方得奶酪值比以前得奶酪值多,问他能最多获得多少奶酪。

思路:

用dfs搜索,除了边界得点每一个点都可以向着四个方向走,每一次可以走一到k步,用dfs和记忆化搜索就能完成,走过的地方标记一下,这样就可以节省时间提高效率.

AC代码:

#include<iostream>
#include<cstring>
using namespace std;
int b[4][2]={0,1,1,0,0,-1,-1,0};
int a[105][105],dp[105][105];
int n,k;
int dfs(int l,int r)
{
    if(dp[l][r]!=-1)
        return dp[l][r];
        int Max=0;
    for(int i=0;i<4;i++)
        for(int j=1;j<=k;j++)
        {
            int xx=l+b[i][0]*j;
            int yy=r+b[i][1]*j;
            if(xx>=0&&xx<n&&yy>=0&&yy<n&&a[xx][yy]>a[l][r])
            {
                int s=dfs(xx,yy);
                if(s>Max)
                    Max=s;
            }
        }
        dp[l][r]=Max+a[l][r];
        return dp[l][r];
}
int main()
{
    while(cin>>n>>k)
    {
        memset(dp,-1,sizeof(dp));
        if(n==-1&&k==-1)
            break;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            cin>>a[i][j];
        dfs(0,0);
        cout<<dp[0][0]<<endl;
    }
}

 

posted @ 2018-08-30 22:53  Leozi  阅读(70)  评论(0编辑  收藏  举报