题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1428

漫步校园

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Problem Description
LL最近沉迷于AC不能自拔,每天寝室、机房两点一线。由于长时间坐在电脑边,缺乏运动。他决定充分利用每次从寝室到机房的时间,在校园里散散步。整个HDU校园呈方形布局,可划分为n*n个小方格,代表各个区域。例如LL居住的18号宿舍位于校园的西北角,即方格(1,1)代表的地方,而机房所在的第三实验楼处于东南端的(n,n)。因有多条路线可以选择,LL希望每次的散步路线都不一样。另外,他考虑从A区域到B区域仅当存在一条从B到机房的路线比任何一条从A到机房的路线更近(否则可能永远都到不了机房了…)。现在他想知道的是,所有满足要求的路线一共有多少条。你能告诉他吗?
 



Input
每组测试数据的第一行为n(2=<n<=50),接下来的n行每行有n个数,代表经过每个区域所花的时间t(0<t<=50)(由于寝室与机房均在三楼,故起点与终点也得费时)。
 



Output
针对每组测试数据,输出总的路线数(小于2^63)。
 



Sample Input
3
1 2 3
1 2 3
1 2 3
3
1 1 1
1 1 1
1 1 1
 



Sample Output
1
6
 



Author
LL

 

解题思路:典型的记忆化搜索,先结合优先队列bfs记录每一个点到终点最短路线条数(完成记忆化),然后dfs搜索路线条数即可~~~

代码如下:

 #include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int map[][], n;
int mark[][];
__int64 dp[][];
int dir[][] = { , , , -, , , -, };
struct node {
int x, y, time;
friend bool operator < (node x1, node x2){
//优先队列,时间小的先出队
return x1.time > x2.time;
}
};
void bfs(){
priority_queue<node>q;
node cur, next;
cur.x = n;//从(n,n)开始往前找,每次找最小时间到达(n,n)
cur.y = n;
cur.time = map[n][n];
mark[n][n] = ;
q.push(cur);
while (!q.empty()){
cur = q.top();
q.pop();
for (int i = ; i < ; i++){
next.x = cur.x + dir[i][];
next.y = cur.y + dir[i][];
if (next.x >= && next.x <= n&&next.y >= && next.y <= n&&!mark[next.x][next.y]){
mark[next.x][next.y] = ;
map[next.x][next.y] += cur.time;//在原数组记录每个点到终点的最短时间
next.time = map[next.x][next.y];
q.push(next);
}
}
}
}
__int64 dfs(int x, int y){
if (dp[x][y] > )return dp[x][y];
for (int i = ; i<; i++){
int v = x + dir[i][];
int u = y + dir[i][];
if (v >= && v <= n&&u >= && u <= n&&map[x][y]>map[v][u])//保证离终点原来越近
dp[x][y] += dfs(v, u);
}
return dp[x][y];
}
int main(){
int i, j;
while (scanf("%d", &n) != -){
memset(mark, , sizeof(mark));
for (i = ; i <= n; i++)
for (j = ; j <= n; j++)
scanf("%d", &map[i][j]);
bfs();
memset(dp, , sizeof(dp));
dp[n][n] = ;
printf("%I64d\n", dfs(, ));
}
return ;
}

[HDU 1428]--漫步校园(记忆化搜索)的更多相关文章

  1. HDU 1428 漫步校园(记忆化搜索,BFS, DFS)

    漫步校园 http://acm.hdu.edu.cn/showproblem.php?pid=1428 Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于 ...

  2. HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)

    题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...

  3. HDU 1428漫步校园

    漫步校园 Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每次从寝室到机房的时间,在校园里散散步.整个HDU校 ...

  4. hdu 4597 Play Game(记忆化搜索)

    题目链接:hdu 4597 Play Game 题目大意:给出两堆牌,仅仅能从最上和最下取,然后两个人轮流取,都依照自己最优的策略.问说第一个人对多的分值. 解题思路:记忆化搜索,状态出来就很水,dp ...

  5. hdu 4856 Tunnels (记忆化搜索)

    Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  6. HDU 4597 Play Game(记忆化搜索,深搜)

    题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的 ...

  7. HDU 5001 概率DP || 记忆化搜索

    2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測 ...

  8. HDU 4597 Play Game (记忆化搜索博弈DP)

    题意 给出2*n个数,分两列放置,每列n个,现在alice和bob两个人依次从任意一列的对头或队尾哪一个数,alice先拿,且两个人都想拿最多,问alice最后能拿到数字总和的最大值是多少. 思路 4 ...

  9. HDU 3779 Railroad(记忆化搜索)

    Railroad Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Subm ...

随机推荐

  1. KMP算法的一次理解

    1. 引言 在一个大的字符串中对一个小的子串进行定位称为字符串的模式匹配,这应该算是字符串中最重要的一个操作之一了.KMP本身不复杂,但网上绝大部分的文章把它讲混乱了.下面,咱们从暴力匹配算法讲起,随 ...

  2. OA项目总结

    一.自定义拦截器:     继承AbstractInterceptor,覆写intercept方法,实现功能逻辑,最后在Struts.xml文件中配置了自定义拦截器,首先自定义拦截器栈, <!- ...

  3. easyui form提交文件(上传图片和文件)

    <div id="dialogBtn"> <a class="easyui-linkbutton" href="#" on ...

  4. CentOS5.4下安装codeblocks 12.11

    centos6.3下安装codeblock简单多了,这些开源的软件也都在不断进步.原来装过codeblocks10.05,忘了,这次安装又花了我半天时间,最后总算搞定. 先是安装了wxGTK-2.8. ...

  5. jquery简单的插件

    $(function() { $.fn.插件名称 = function(options) { var defaults = { Event : "click", //触发响应事件 ...

  6. Linux 动态库剖析

    进程与 API 动态链接的共享库是 GNU/Linux® 的一个重要方面.该种库允许可执行文件在运行时动态访问外部函数,从而(通过在需要时才会引入函数的方式)减少它们对内存的总体占用.本文研究了创建和 ...

  7. PCB抄板评估需要关注的因素

    减少PCB抄板的反复是可能的,但这依赖于抄板前期工作的完成情况.多数时候,越是到产品抄板的后期越容易发现问题,更为痛苦的是要针对发现的问题进行更改.然而,尽管许多人都清楚这个经验法则,但实际情况却是另 ...

  8. Android Studio 新建项目的R文件丢失的解决方法

    最近Android Studio炒的比较热,于是笔者决定赶赶时髦,从Eclipse转到了Android Studio.不幸的是,用Android Studio创建项目的时候就遇到了一个比较尖锐的问题— ...

  9. HDU 1130 How Many Trees?

    裸的卡特兰数 C++#include<iostream> #include<cstdio> using namespace std; #define base 10000 #d ...

  10. Oracle DBA常用的系统表

    1.2 DBA常用的表1.2.1  dba_开头    dba_users数据库用户信息    dba_segments  表段信息    dba_extents    数据区信息    dba_ob ...