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
 

思路:
这题再加上之前的那道老鼠题,算是记忆化搜索的模板题了,现在来学真是没觉得有什么难度,理顺了题目的思路,看了kuangbin大神的AC代码后,凭着思路在脑中复原代码修正后AC了
题目说A->B点的要求是B点到终点的多个距离中,肯定存在一个dis是小于A点所有到终点的距离的,而A点所有到终点的距离中就会包括通过B到达终点的距离————对这种逻辑进行一下总结,就会发现它让你求的就是起点到终点相同长度最短路的条数
知道了这点之后,我们就可以开始计算所有的最短路了
计算最短路就是用Dijkstra,但是这个题这样做就麻烦了,其实这道题目用的方法Dijkstra是相同的,他们实质都是相同的,即每次对选入最短路线集合的点,松弛他的所有邻边。对于原始的Dij而言,我们用的for扫描整个数组,然后找出相邻的边,再对他们进行松弛操作。
都记录了最短距离之后,在递归求得第一个点的答案。

#include <iostream>
#include <cstring>
#include <queue>
using namespace std; struct node {
int x,y;
int d;
};
int n;
int map[][];
int dis[][];
__int64 dp[][];
int vis[][];
int dir[][] = {{,},{-,},{,},{,-}}; bool operator < (node a,node b) {
return a.d>b.d;
} void dfs()
{
priority_queue<node> que;
memset(vis,,sizeof(vis));
node tmp,next;
tmp.x = n;
tmp.y = n;
tmp.d = map[n][n];
que.push(tmp);
while(!que.empty())
{
tmp = que.top();
que.pop();
if(vis[tmp.x][tmp.y])
continue;
vis[tmp.x][tmp.y] = ;
dis[tmp.x][tmp.y] = tmp.d;
for(int i = ;i < ;i++) {
next.x = tmp.x+dir[i][];
next.y = tmp.y+dir[i][];
if(next.x<||next.x>n||next.y<||next.y>n||vis[next.x][next.y])
continue;
next.d = tmp.d + map[next.x][next.y];
que.push(next);
}
}
} __int64 solve(int x,int y)
{
if(dp[x][y] != -) return dp[x][y];
else {
node next;
dp[x][y] = ;
for(int i = ;i < ;i++) {
next.x = x+dir[i][];
next.y = y+dir[i][];
if(next.x<||next.x>n||next.y<||next.y>n)
continue;
next.d = dis[next.x][next.y];
if(next.d < dis[x][y])
dp[x][y]+=solve(next.x,next.y);
}
return dp[x][y];
}
} int main()
{
while(cin>>n)
{
memset(dp,-,sizeof(dp));
for(int i = ;i <= n;i++)
for(int j = ;j <= n;j++)
cin>>map[i][j];
dfs();
/*测试最小距离
cout<<endl<<"~~~"<<endl;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++){
cout<<dis[i][j]<<' ';
if(j == n)
cout<<endl;
}
*/
dp[n][n] = ;
cout<<solve(,)<<endl;
}
return ;
}
 

HDU-1428(记忆化搜索)的更多相关文章

  1. hdu 4722(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4722 思路:简单的记忆化搜索,留意一下A==0时的情况就可以了. #include<iostre ...

  2. HDU 4597 记忆化搜索

    ² 博弈取牌—记忆化搜索 题目描述: 有两副带有数字的牌,(数字>0)两人轮流取,取中了某张牌,自己的分数就加上牌上的数字,但只能从两端取,每人都会用最优的策略使得自己的分数最高.问A先取,他能 ...

  3. hdu 1514 记忆化搜索

    题意是给4堆(堆的高度小于等于40)有颜色(颜色的种类小于等于20)的物品,你有一个篮子最多能装5件物品,每次从这4堆物品里面任取一件物品放进篮子里,但是取每堆物品时,必须先取上面的物品,才能取下面的 ...

  4. hdu 1208 记忆化搜索

    题目大意:只能按照格子上的数字*方向走,从左上走到右下Sample Input42331121312313110Sample Output3 直接记忆化搜索,注意是0的情况 #include<c ...

  5. hdu 4960 记忆化搜索 DP

    Another OCD Patient Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Ot ...

  6. hdu 2089 记忆化搜索写法(数位dp)

    /* 记忆化搜索,第二维判断是否是6 */ #include<stdio.h> #include<string.h> #define N 9 int dp[N][2],digi ...

  7. Hdu 4597记忆化搜索

    好久没有做题了,水平已经完全在学弟之下了. 一个吉林邀请赛最水的题目.:( 其实这题一看到数据范围,只可以想到思路,直接爆搜,加个记忆化. 这题虽然A了,但是我还是没太想清楚一些边界情况,心虚着A了. ...

  8. HDU 1978 记忆化搜索(dfs+dp)

    Y - How many ways Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  9. hdu 1078(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 //dp[i][j]表示从点i,j处开始能获得的最多cheese #include <io ...

  10. hdu 1978 记忆化搜索

    注意: dp[i][j] 表示(i,j)这个点有多少种方式       mark[i][j]表示这个点是否走过  假设有直接返回dp[i][j]    dp的求法为全部梦走到点的dp的和 注意mark ...

随机推荐

  1. sqlcipher移植

    一.下载代码 sqlcipher赖openssl库,首先下载openssl: [fulinux@ubuntu ~]$ git clone https://github.com/openssl/open ...

  2. C++中将string类型转换为int, float, double类型 主要通过以下几种方式:

      C++中将string类型转换为int, float, double类型 主要通过以下几种方式: # 方法一: 使用stringstream stringstream在int或float类型转换为 ...

  3. shell编程备忘

    1.脚本存放目录 workspace="$(cd "$(dirname "$0")"; pwd)" 2.输出  其中 command 代表指 ...

  4. java中的异常机制(编译时异常)

    / * 1 异常机制的原理 * 异常是什么:就是错误的另外一种说法; * 在java中,有一个专门模拟所有异常的类,所有的异常都必须继承这个类:Throwable; * 本质是:当程序出错以后,jvm ...

  5. uploadify在asp.net中的试用小结

    花了差不多一下午的时间,总算把uploadify插件运行起来,在此对自己遇到的问题以及过程做一个小结. 一.使用步骤 1.在官网下载最新的插件包,并将包解压. 2.新建asp.net web项目,将解 ...

  6. ASP.NET数据绑定控件简介

    •数据绑定分为数据源和数据绑定控件两部分(①数据绑定控件通过数据源获取和修改数据②数据绑定控件通过数据源隔离数据提供者和数据使用者)数据绑定控件→数据源→数据库•数据源:SqlDataSource(连 ...

  7. Lesson 7: Responsive Typography In Action

    Lesson 7: Responsive Typography In Action 排版一直都是设计和传达的基础.虽然现在的设计和印刷品设计差别很大,但核心原则还是不变的. Article 1: Bo ...

  8. 修复 status 为 unusable 的 index

    以DBA权限登陆,执行以下脚本即可. declare     -- 指向所有 UNUSABLE 状态的 index 的游标      cursor c is        select index_n ...

  9. PHPCMSV9 采集网址后,再采集内容,报错:“采集采集内容 没有找到网址列表,请先进行网址采集”

    解决方法:直接清除v9_collection_history 表里的内容.

  10. UVA 1600 Patrol Robot

    带状态的bfs 用一个数(ks)来表示状态-当前连续穿越的障碍数: step表示当前走过的步数: visit数组也加一个状态: #include <iostream> #include & ...