HDOJ 1428 漫步校园
2016-04-15 21:21
316 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1428
这道题目应该是一道裸的记忆化搜索,但不知道为什么HDOJ官方分类里面把它分进了Dynamic Programming(动态规划)里面
,这题虽然是中文题,但是其实还是有很多童鞋读不懂这道题的题意,尤其是这句话:
考虑从A区域到B区域仅当存在一条从B到机房的路线比任何一条从A到机房的路线更近
这句话说的有点玄啊,意思其实就是如果我们当前位置到终点的最短路径比下一个点的最短路径小,那就不走这个点,也就是说我们还需要求出每一个点到终点的最短路径,在将其作为值进行一次从起点开始的记忆化搜索,即可找到我们的答案。
这道题目应该是一道裸的记忆化搜索,但不知道为什么HDOJ官方分类里面把它分进了Dynamic Programming(动态规划)里面
,这题虽然是中文题,但是其实还是有很多童鞋读不懂这道题的题意,尤其是这句话:
考虑从A区域到B区域仅当存在一条从B到机房的路线比任何一条从A到机房的路线更近
这句话说的有点玄啊,意思其实就是如果我们当前位置到终点的最短路径比下一个点的最短路径小,那就不走这个点,也就是说我们还需要求出每一个点到终点的最短路径,在将其作为值进行一次从起点开始的记忆化搜索,即可找到我们的答案。
#include <iostream> #include <queue> #include <cstring> #include <cstdio> using namespace std; const int MAXN = 55; const int INF = 0x3f3f3f3f; int map[MAXN][MAXN]; int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; struct Node { int x,y; }; int dis[MAXN][MAXN]; __int64 res[MAXN][MAXN]; bool vis[MAXN][MAXN]; int n; void SPFA() { queue<Node> Q; int i,j,k; for(i = 0;i < MAXN;i ++) for(j = 0;j < MAXN;j ++) dis[i][j] = INF; memset(vis,0,sizeof(vis)); dis = map ; Node p,q; p.x = n; p.y = n; Q.push(p); vis[p.x][p.y] = 1; while(!Q.empty()) { q = Q.front(); Q.pop(); vis[q.x][q.y] = 0; for( k = 0;k < 4;k ++) { p.x = q.x + dir[k][0]; p.y = q.y + dir[k][1]; if(p.x >= 1 && p.x <= n && p.y >= 1 && p.y <= n && dis[p.x][p.y] > dis[q.x][q.y] + map[p.x][p.y]) { dis[p.x][p.y] = dis[q.x][q.y] + map[p.x][p.y]; if(!vis[p.x][p.y]) { Q.push(p); vis[p.x][p.y] = 1; } } } } } __int64 dfs(int i,int j) { if(i == n && j == n) return 1; if(res[i][j] != -1) return res[i][j]; res[i][j] = 0; int k; for(k = 0;k < 4;k ++) { int x,y; x = i + dir[k][0]; y = j + dir[k][1]; if(x >= 1 && x <= n && y >= 1 && y <= n && dis[x][y] < dis[i][j]) res[i][j] += dfs(x,y); } return res[i][j]; } int main() { int i,j; while(scanf("%d",&n) != EOF) { for(i = 1;i <= n;i ++) for(j = 1;j <= n;j ++) scanf("%d",&map[i][j]); SPFA(); memset(res,-1,sizeof(res)); printf("%I64d\n",dfs(1,1)); } return 0; }
相关文章推荐
- Android:PopupWindow简单弹窗
- 玩的开心
- Sass入门——基本特性-基础
- 第七周学习总结
- NYOJ 1238 最小换乘
- 分数修改
- 【DP】HIHO 1078
- [android]ShareSDK——内容分享和短信验证
- [原创]Cef3 2623.1397 开启ppapi flash插件
- HTML5 localStorage图书阅读器实例
- 剑指offer 面试题19:二叉树的镜像(leetcode226. Invert Binary Tree) 题解
- poj 3255 Roadblocks
- 常用 Git 命令清单
- match()方法与正则子表达式
- javascript中面向对象的三大作用
- Recursive PLS algorithms for adaptive的简单介绍
- 文件分割器,一个读取流,相应多个输出流,并且生成的碎片文件都有有序的编号
- Skinned Mesh 原理解析和一个最简单的实现示例
- 判断出栈顺序的合法性(面试题)
- Android:密码显示隐藏