hdu(1078)——FatMouse and Cheese(递推型动归)

题意:

现在有n*n的方块,然后每个方块中都有一个值,代表这个方块中含有奶酪的数量。

现在那个老鼠站在(0,0)点,并且它每次最多走k步,然后每次走到一个点,它都能获得那个点上含有的值,但是要保证它下次走到的点含有的奶酪数必须多于它现在在的那个位置上的奶酪数量。

思路:

这道题也是一道递推性动归,和poj 1088 滑雪那题的区别就是这题最多可以走k步。

这道题让我更加深刻的理解了递推性动归。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define me rng_58
#define maxn 111
int a[maxn][maxn],dp[maxn][maxn];
int n,k;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int dfs(int x,int y){
	if(dp[x][y]) return dp[x][y];
	int ans=0,smax=0;
	for(int i=1;i<=k;i++){
		for(int j=0;j<4;j++){
			int tx=x+dx[j]*i;
			int ty=y+dy[j]*i;
			if(tx>=0&&ty>=0&&tx<=n-1&&ty<=n-1&&a[x][y]<a[tx][ty]){
				ans=dfs(tx,ty);
				smax=max(smax,ans);			//smax在这里的作用是为了保存以当前节点然后扩散下去然后所能获得的和的最大值
				//总的过程还是回溯,回溯到(0,0)这个点,然后获得最大值;
			}
		}
	}
	dp[x][y]=smax+a[x][y];
	return dp[x][y];
}
int main(){
	while(~scanf("%d%d",&n,&k)){
		if(n==-1&&k==-1) break;
		memset(a,0,sizeof(a));
		memset(dp,0,sizeof(dp));
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++)
			scanf("%d",&a[i][j]);
		}
		int sum=dfs(0,0);
		printf("%d\n",sum);
	}
}

*一开始我对dfs回溯中那个smax不是很理解,后来想通了。

首先我们找到一个值dp[x][y]>0时,然后回溯,在一开始smax是为0的,但是再回溯时,ans被更新,然后smax同时也被更新了。

这样,后面的dp[x][y]也能不断被更新,保证它们取得的都是在(x,y)点上的最大值。

如果还是不能理解递推型动归的话,推荐:http://m.blog.csdn.net/blog/hncu1206401liuhao/41546005

以及那幅很好懂的图:http://img.blog.csdn.net/20141127153054437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamluZ2RpYW5pdG5hbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

把这道题A了之后,可以去做一下poj 1088 滑雪,现在我能很顺利的写出来了。

加油!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 21:51:56

hdu(1078)——FatMouse and Cheese(递推型动归)的相关文章

[2016-03-28][HDU][1078][FatMouse and Cheese]

时间:2016-03-28 17:40:34 星期一 题目编号:[2016-03-28][HDU][1078][FatMouse and Cheese] #include <algorithm> #include <cstring> #include <cstdio> using namespace std; const int maxn = 100 + 10; int a[maxn][maxn]; int dp[maxn][maxn]; int n ,k; int d

HDU 1078 FatMouse and Cheese(DP)

题意  老鼠在一个小镇吃奶酪  城镇可以看成一个n*n的矩阵  其中每个格子都有一定数量的奶酪mat[i][j]   老鼠从(0,0) 开始吃   而且下个吃的格子里的奶酪必须比上个格子多   老鼠只能水平方向或者垂直方向走  而且每次走的距离不能超过k  求老鼠最多能吃多少奶酪 起点是固定的   比较容易   直接记忆化搜索 令d[i][j]表示以(i,j)为终点的最优解  那么对于所有(i,j)能到达的点(x,y)有  d[i][j]=max(d[i][j],d[x][y]+mat[x][y

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

HDU 1078 FatMouse and Cheese ( DP, DFS)

HDU 1078 FatMouse and Cheese ( DP, DFS) 题目大意 给定一个 n * n 的矩阵, 矩阵的每个格子里都有一个值. 每次水平或垂直可以走 [1, k] 步, 从 (0, 0) 点开始, 下一步的值必须比现在的值大. 问所能得到的最大值. 解题思路 一般的题目只允许 向下 或者 向右 走, 而这个题允许走四个方向, 所以状态转移方程为 dp(x, y) = dp(nextX, nextY) + arr(x, y); dp 代表在 x, y 的最大值. 由于 下一

poj(1088)——滑雪(经典递推型动归)

题意: 中文题,就是在所有的点中找一个点作为起点,然后叫你找出从起点开始的最长路径是多少. 这里高度必须严格递减. 思路: 一开始我碰到这题时,没有思路,是看题解写的. 但是今天我回头再去看时,发现自己能够独立写出来了,而且和上次的方法不一样.也许这就是进步吧! 其实就是一个递推型动归,如果理解了上一题,那么这题也好做了. 这是第一次写的: #include<stdio.h> #include<string.h> #include<iostream> #include&

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

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

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

HDU - 1078 FatMouse and Cheese(记忆化+dfs)

FatMouse and Cheese 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

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5701    Accepted Submission(s): 2320 Problem Description FatMouse has stored some cheese in a city. The city can be considered as a square grid of