暑假-动态规划 III-D - FatMouse and Cheese
2015-08-19 11:09
260 查看
题意:有个n*n的迷宫,每个位置都有一定数量的cheese,每次只能从当前位置向(上,下,左,右)走1-k步,
并且下一个位置要比当前位置的cheese数量多。
问:现在老鼠从位置(0,0)出发,最多能获得多少cheese。
思路:记忆化搜索,递归。
并且下一个位置要比当前位置的cheese数量多。
问:现在老鼠从位置(0,0)出发,最多能获得多少cheese。
思路:记忆化搜索,递归。
#include<iostream> #include<cstring> using namespace std; const int MAXN = 105; int map[MAXN][MAXN]; //保存相应位置的cheese的数量 int dp[MAXN][MAXN]; //dp[i][j]表示从坐标(i,j)出发所能得到的cheese的最大值 int n, k; //迷宫大小,步伐上限 int bfs(int x,int y) { int nextx, nexty, maxval = 0,temp; //下一个位置的横坐标,纵坐标,整体最大值,临时最大值 if (dp[x][y]!=-1)//记忆化搜索,如果已经算过,直接返回 { return dp[x][y]; } for (int i = 1; i <= k; i++)//步伐从1-k { nextx = x - i, nexty = y;//向上走 if (nextx >= 0 && map[nextx][nexty] > map[x][y]) {//满足条件:不越界,并且下一个位置比当前位置的cheese数量多 temp = bfs(nextx, nexty);//更新这个方向的最大值 if (temp > maxval)//更新整体最大值 { maxval = temp; } } nextx = x + i, nexty = y;//向下走 if (nextx < n && map[nextx][nexty] > map[x][y]) {//满足条件:不越界,并且下一个位置比当前位置的cheese数量多 temp = bfs(nextx, nexty);//更新这个方向的最大值 if (temp > maxval)//更新整体最大值 { maxval = temp; } } nextx = x, nexty = y - i;//向左走 if (nexty >= 0 && map[nextx][nexty] > map[x][y]) {//满足条件:不越界,并且下一个位置比当前位置的cheese数量多 temp = bfs(nextx, nexty);//更新这个方向的最大值 if (temp > maxval)//更新整体最大值 { maxval = temp; } } nextx = x, nexty = y + i;//向右走 if (nexty < n && map[nextx][nexty] > map[x][y]) {//满足条件:不越界,并且下一个位置比当前位置的cheese数量多 temp = bfs(nextx, nexty);//更新这个方向的最大值 if (temp > maxval)//更新整体最大值 { maxval = temp; } } } dp[x][y] = maxval + map[x][y]; //整体最大值+原本位置的数目等于从x,y出发的最大值 return dp[x][y]; } int main() { while (cin >> n >> k) { if (n == -1 && k == -1) { break; } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> map[i][j]; } } memset(dp, -1, sizeof(dp)); //初始化为-1,因为map[i][j]的值为0-100 cout << bfs(0, 0) << endl; } return 0; }
相关文章推荐
- jboss eap 6.3 域(Domain)模式配置
- easyui datagrid 逻辑分页
- 去掉UIScrollView的滚动条
- 代理衍生及实现
- Chapter 6 : Delegation和Debug - The Big Nerd Ranch Guide 读书笔记
- 分享:Android系统的常用权限整理
- Shortest Palindrome -- leetcode
- C++ 之 Vector(容器)初始化高维数组
- zookeeper+kafka配置
- 跨站脚本攻击之XSS漏洞
- FreeMarker的模板文件语法
- ruby on rails 关于微信企业号回调模式初步验证通过后再次签名验证失败的解决
- 最低公共祖先Lowest Common Ancestor of a Binary Tree
- leetcode 139: Word Break
- 批处理命令的技巧
- JavaScript indexOf() 方法
- 关闭所有Activity和连续点击两次返回键关闭程序的方法
- windows下 IP 访问策略控制 (Windows IP安全策略控制)
- [LeetCode] Group Anagrams
- hibernate错误收集