HDU 1078 FatMouse and Cheese【记忆化搜索】

题意:给出n*n的二维矩阵,和k,老鼠每次最多走k步,问老鼠从起点(0,0)出发,能够得到的最大的数(即为将每走过一点的数都加起来的和最大)是多少

和上一题滑雪一样,搜索的方向再加一个循环

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include <cmath>
 5 #include<algorithm>
 6 using namespace std;
 7
 8 typedef long long LL;
 9 int a[1005][1005],d[1005][1005],n,k;
10 int dir[4][2]={1,0,-1,0,0,1,0,-1};
11
12 int dfs(int x,int y){
13     if(d[x][y]) return d[x][y];//如果已经搜过这一点,则直接返回,不用再重复计算
14     int ans=0;
15     for(int j=1;j<=k;j++){
16         for(int i=0;i<4;i++){ //四个 方向搜
17         int nx=x+dir[i][0]*j;
18         int ny=y+dir[i][1]*j;
19         if(nx<0||nx>=n||ny<0||ny>=n) continue;//越界
20         if(a[x][y]<a[nx][ny])
21         ans=max(ans,dfs(nx,ny));
22       }
23     }
24
25     return d[x][y]=ans+a[x][y];
26 }
27
28 int main()
29 {
30     while(scanf("%d %d",&n,&k)!=EOF&&n!=-1&&k!=-1){
31         for(int i=0;i<n;i++)
32         for(int j=0;j<n;j++) cin>>a[i][j];
33
34         memset(d,0,sizeof(d));
35
36         printf("%d\n",dfs(0,0));
37     }
38     return 0;
39 }

时间: 2024-11-23 03:22:56

HDU 1078 FatMouse and Cheese【记忆化搜索】的相关文章

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

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

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

题意:有一个n*n的格子.每一个格子里有不同数量的食物,老鼠从(0,0)開始走.每次下一步仅仅能走到比当前格子食物多的格子.有水平和垂直四个方向,每一步最多走k格,求老鼠能吃到的最多的食物. 分析: 矩阵上求最大子路线和,可是不像一维的最大子序列那么easy,由于二维的确定不了计算顺序. 既然不能确定计算顺序,那么就能够利用dp记忆化搜索,这个正好不用管计算顺序: dp记忆化搜索的思想:递归,然后通过记录状态dp[i][j]是否已经计算过来保证每一个状态仅仅计算一次避免反复计算.若计算过则返回d

[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.

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 ACM 1078 FatMouse and Cheese 记忆化+DFS

题意:FatMouse在一个N*N方格上找吃的,每个点(x,y)有一些吃的,FatMouse从(0,0)的出发去找吃的,每次最多走k步,他走过的位置可以吃掉吃的,保证吃的数量在0-100,规定他只能水平或者垂直走,每走一步,下一步吃的数量需要大于此刻所在位置,问FatMouse最多可以吃多少东西. 需要对步数进行扩展. #include<iostream> using namespace std; #define N 101 #define max(a,b) ((a)>(b)?(a):(

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

[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

HDU 1078 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