HDU1078_FatMouse and Cheese【记忆化搜索】

FatMouse and Cheese

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 5124    Accepted Submission(s): 2076

Problem Description

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.

Input

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.

Output

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

Sample Input

3 1

1 2 5

10 11 6

12 12 7

-1 -1

Sample Output

37

Source

Zhejiang University Training Contest 2001

题目大意:有个N*N格子的正方形,每个单位格子里放有0~100块奶酪。

有一只老鼠站在左上角,他每次只能水平或竖直移动k步,且它只吃它当

前所站的格子的奶酪和比这个格子上的奶酪多的格子上的奶酪。问:这只

老鼠最多能吃到多少奶酪。

思路:从左上角(0,0)开始,找到一条最长的路径,使得这条路径上满足从

(Xi,Yi)->(Xi+1,Yi+1)满足map[Xi+1][Yi+1]>map[Xi][Yi],且在水平方向

上或竖直方向上所走步数2不超过k。这里用dire数组来存上下左右4个方

向。j*dire[i][0]和j*dire[i][1]表示横向和纵向所走步数。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int N,k,map[110][110],dp[110][110],dire[4][2]={{0,1},{0,-1},{1,0},{-1,0}};

int dfs(int x,int y,int k,int N)
{
    if(dp[x][y])
        return dp[x][y];
    int MaxSum = 0;
    for(int i = 0; i < 4; i++)
    {
        for(int j = 1; j <= k; j++)
        {
            int tx = x + j*dire[i][0];
            int ty = y + j*dire[i][1];
            if(tx >= 0 && tx < N && ty >= 0 && ty < N &&map[tx][ty] > map[x][y])
            {
                MaxSum = max(MaxSum,dfs(tx,ty,k,N));
            }
        }
    }
    dp[x][y] = MaxSum + map[x][y];
    return dp[x][y];
}
int main()
{
    while(~scanf("%d%d",&N,&k) && (N!=-1 && k!=-1))
    {
        memset(map,0,sizeof(map));
        memset(dp,0,sizeof(dp));
        for(int i = 0; i < N; i++)
            for(int j = 0; j < N; j++)
                scanf("%d",&map[i][j]);

        int ans = dfs(0,0,k,N);
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-22 02:07:19

HDU1078_FatMouse and Cheese【记忆化搜索】的相关文章

hdu1078 FatMouse and Cheese(记忆化搜索)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 Problem Description 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

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 题目大意:一个n*n的图,每个点都有奶酪,老鼠从(0,0)开始走,每次最多只能走k步就要停下来,停下的这个位置的奶酪数只能比上一个停留的位置大,并获取其奶酪,每次只能水平或垂直走,问最多能得到的奶酪. 解题思路:记忆化搜索,这方面还是写的太少,还要看别人才会,这个就当个例子参考吧. 1 #include<cstdio> 2 #include<cstring> 3 #include

FatMouse and Cheese(记忆化搜索)

Problem Description 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 a

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

题意:给定一个n*n的矩阵,问从(0,0)开始走,每次最多水平或者垂直走k个格子,且要保证每次到达的格子要大于前一个,问最大和是多少. 析:一个很简单的记忆搜索,dp[i][j],表示到达(i,j)的最大和是多少,我们可以反着推出答案. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cst

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

详见代码 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <memory.h> 5 using namespace std; 6 const int inf=0x3f3f3f3f; 7 int a[110][110]; 8 int dp[110][110];//表示到i,j的最大路径和 9 int dir[4][2]= {1,0,-1,0,0,1,0,-1};

[HDOJ1078]FatMouse and Cheese(记忆化搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意:给出n, k,然后给出n*n的地图,(下标0~n-1),有一只老鼠从(0,0)处出发,只能走直线,并且目标点的数值比当前点要大.每次最长可以走k步,问最长的一条链的数值和. 用一个二维数组dp(i,j)表示某一格出发的时候最长链的数值和,然后dfs. 1 #include <algorithm> 2 #include <iostream> 3 #include <io

记忆化搜索,FatMouse and Cheese

1.从gird[0][0]出发,每次的方向搜索一下,每次步数搜索一下 for(i=0; i<4; i++) { for(j=1; j<=k; j++) { int tx=x+d[i][0]*j; int ty=y+d[i][1]*j; if(tx>=0&&tx<n&&ty>=0&&ty<n&&grid[x][y]<grid[tx][ty]) { int temp=memSearch(tx,ty); i

hdu1078 FatMouse and Cheese(记忆化搜索)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1078 题目大意: 题目中的k表示横向或者竖直最多可曾经进的距离,不可以拐弯.老鼠的出发点是(1,1). 对于老鼠从当前点可以到达的点.筛选出从这些点到达当前点所能获得的cheese的最大值. 思路:记忆化搜索. 假设对于当前的点.没有被搜索过(dp[i][j]=0).那么就对其进行搜索.搜索过程中记录下最优的解. 假设已经被搜索过了,就能够直接利用已经记录的值来进行推断 了,不须要再去搜索. 假设

hdu 1078 FatMouse and Cheese (dfs+记忆化搜索)

pid=1078">FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4811    Accepted Submission(s): 1945 Problem Description FatMouse has stored some cheese in a city. The city can

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

FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5463    Accepted Submission(s): 2227 Problem Description FatMouse has stored some cheese in a city. The city can be considere