POJ 2111 Millenium Leapcow(记忆化搜索+dfs记录路径)
题目链接
思路
对N*N网格中所有点进行搜索(dfs),搜索过程中对每一步进行记忆化存储,即dp数组保存从当前点开始可获得的最高得分,若后面需要用到前面计算过的数据,直接读取dp数组即可。
- dp[i][j]表示从点(i,j)出发可获得的最高得分。
由于本题需要输出最小的路线,所以在搜索过程中要注意,得分相同的两条路要考虑所在点的数字大小。
路径的记录用结构体保存。
不要忘了比较得分相同的起点中,哪个点的数字最小!
代码:
#include <iostream>
#include <cstring>
using namespace std;
int farm[370][370]={0},dp[370][370];
int nxtx[8]={2,1,-1,-2,-2,-1,1,2};
int nxty[8]={1,2,2,1,-1,-2,-2,-1};
int n;
struct nextStep { int x, y; }node[370][370]; //存储后继结点坐标
int dfs(int x, int y)
{if(dp[x][y]!=0) return dp[x][y];int maximum = /*farm[x][y]*/ 1;int minx = x + nxtx[0], miny = y + nxty[0]; // 记录farm值最小的坐标for(int i=0 ; i<8 ; i++){int tx = x + nxtx[i];int ty = y + nxty[i];if(tx<=n && tx>=1 && ty<=n && ty>=1 && farm[x][y] < farm[tx][ty]){//maximum = max(maximum , dfs(tx,ty)+1);if(maximum<dfs(tx,ty)+1){maximum = dfs(tx,ty)+1;node[x][y].x = tx, node[x][y].y = ty;minx = tx, miny = ty;}//相同时选farm值最小的else if(maximum==dfs(tx,ty)+1 && farm[minx][miny] > farm[tx][ty]){node[x][y].x = tx, node[x][y].y = ty;minx = tx, miny = ty;}}}return dp[x][y] = maximum;
}
int main()
{ios::sync_with_stdio(false);int i, j;memset(node,0,sizeof(node));cin >> n;for(i=1 ; i<=n ; i++)for(j=1 ; j<=n ; j++)cin >> farm[i][j];int maxscore=0, max_x, max_y; //最高得分,即最终结果;最终结果的x,y坐标for(i=1 ; i<=n ; i++){for(j=1 ; j<=n ; j++){if(dp[i][j]!=0) continue;dp[i][j] = dfs(i,j); //每个起始点的得分赋给dp[i][j]//maxscore = max(maxscore , dp[i][j]);if(maxscore < dp[i][j]){maxscore = dp[i][j];max_x = i, max_y = j;}//相同时选farm值最小的else if(maxscore == dp[i][j] && farm[max_x][max_y]>farm[i][j])max_x = i, max_y = j;}}cout<<maxscore<<endl;for(int t=0 ; t<maxscore ; t++){ //输出路径cout<<farm[max_x][max_y]<<endl;int tx = max_x, ty = max_y;max_x = node[tx][ty].x;max_y = node[tx][ty].y;}return 0;
}
POJ 2111 Millenium Leapcow(记忆化搜索+dfs记录路径)相关推荐
- 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof
题目传送门 1 /* 2 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 3 ans = min (ans, max (dp[x][y-i], dp[x-1][i ...
- POJ 2111 Millenium Leapcow (搜索)
题意:类似滑雪,找出最长路劲,多个答案 输出字典序最小的. 思路:将矩阵上的数字从大到小排序,贪心找路劲..复杂度O(n*n*logn) #include <iostream> #incl ...
- Pearls POJ - 1260(区间记忆化搜索)
题意: n件物品,给出数量和价格,(注意数量和价格都是升序给出的这个是能DP的关键),要买掉所以商品 对于每类物品,所需要的价格是(a[i]+10)*p[i] ,即要多买10件,也可以把价格低的物品合 ...
- POJ - 2111 Millenium Leapcow(从最大出发到最小,再反向记录路径)
题目链接:https://cn.vjudge.net/contest/321389#problem/F 翻译: 任意寻一个点,按照国际象棋的走法,同时下一个点的值必须大于前一个点的值,找到一条最长路径 ...
- 记忆化搜索例题 记忆化搜索
1.poj 1579 题目链接: http://poj.org/problem?id=1579 代码如下: #include <cstdio> #include <cstring& ...
- 【DP】【记忆化搜索】NIKOLA(jzoj 1150)
NIKOLA 题目大意: NIKOLA画了一排数字,他一开始在1,他可以往前跳T+1格(T为上一次跳到此格跳的格数),或往后T格(T一开始为0),但不能跳出界,没跳到一个格子,就要加上此格子的值(一开 ...
- 山东省第五届省赛题C Colorful Cupcakes(五维数组+记忆化搜索)
在写题目之前先来介绍一下记忆化搜索. 算法上依然是搜索的流程,但是搜索到的一些解用动态规划那种思想和模式保存.一般来说,动态规划总要遍历所有的状态,而搜索可以排除一些无效的状态.最最最最最主要的是,搜 ...
- 海贼王之伟大航路——状压记忆化搜索
海贼王之伟大航路 题意: 一共 n 个点,给定任意两点的距离 dis[i,j]dis[i, j]dis[i,j]. 问,从点 1 到点 n,中途所有节点经过且仅经过一次,距离最短为多少? (2< ...
- 01迷宫(深搜寻找+记忆化搜索)
01迷宫(深搜+记忆化搜索) 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. ...
最新文章
- 重磅!谷歌刚刚发布Objectron新数据集,可完美检测3D目标,超过4百万幅图像和15K视频剪辑!...
- MS SQLSERVER通用存储过程分页
- JS获取字符串实际长度!
- HDU 2191 - 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (多重背包)
- 分压式静态工作点稳定电路
- java继续_Java中消除实现继续和面向接口编程
- Kotlin学习笔记20 阶段复习2
- Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)
- MySQL 备份 nb3 和 psc的区别
- [译]为什么Vue不支持templateURL
- Ceph:一个新时代的开始
- Android程序暂停sh,init进程 解析Android启动脚本init.rc 修改它使不启动android init.rc中启动一个sh文件...
- Unity 制作RPG小地图
- JavaScript开发环境Aptana
- Canonical发布信息图:Ubuntu Linux连接一切
- cmake指定输出安装目录
- 《动手学深度学习》网页版
- angular $element.html 数据展示不出来,element-ui Table 组件循环列表数据不显示?
- Scratch制作飞翔的小喵小游戏
- python编程长方形面积公式_求长方形面积-题解(Java代码)