漫步校园

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
 
题解:设F[i][j]表示,从(i,j),跑到终点的方案数,我们用spfa预处理出当前节点到终点的距离,对于距离变大的,就不可以进行状态转移,
然后记忆化搜索,把可行的地方的方案数加起来就可以了。
#include<iostream>
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<stdlib.h>
#include<cstring>
#define ll long long
using namespace std;
int n;
ll mp[][],dis[][];
int addx[]={,,-,,},addy[]={,,,,-};
int have[][];
ll f[][];
void spfa(int starx,int stary){
queue<int> xx,yy;
while(!xx.empty()) xx.pop();
while(!yy.empty()) yy.pop();
xx.push(starx);
yy.push(stary);
dis[starx][stary]=mp[starx][stary],have[starx][stary]=;
while(!xx.empty()){
int nowx=xx.front();
int nowy=yy.front();
xx.pop(),yy.pop();
have[nowx][nowy]=;
for(int i=;i<=;i++){
int tox=nowx+addx[i],toy=nowy+addy[i];
if(tox<=||tox>n||toy>n||toy<=) continue;
if(dis[tox][toy]>dis[nowx][nowy]+mp[tox][toy])
{
dis[tox][toy]=dis[nowx][nowy]+mp[tox][toy];
//printf("nowx=%d nowy=%d tox=%d toy=%d\n",nowx,nowy,tox,toy);
//printf("dis[nowx][nowy]=%d dis[tox][toy]=%d mp[tox][toy]=%d\n",dis[nowx][nowy],dis[tox][toy],mp[tox][toy]);
if(have[tox][toy]==){
xx.push(tox);
yy.push(toy);
have[tox][toy]=;
}
}
}
}
}
void cl(){
memset(mp,,sizeof(mp));
memset(f,,sizeof(f));
memset(have,,sizeof(have));
memset(dis,,sizeof(dis));
}
ll dp(int x,int y){
if(f[x][y]) return f[x][y];
if(x==n&&y==n) return ;
ll now=;
for(int i=;i<=;i++){
int tox=x+addx[i];
int toy=y+addy[i];
if(tox<=||tox>n||toy>n||toy<=) continue;
if(dis[tox][toy]<dis[x][y]) now+=dp(tox,toy);
}
return f[x][y]=now;
}
int main(){
while(scanf("%d",&n)!=EOF){
cl();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
cin>>mp[i][j];
spfa(n,n);
printf("%lld\n",dp(,));
}
}

HDU 1428漫步校园的更多相关文章

  1. [HDU 1428]--漫步校园(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1428 漫步校园 Time Limit: 2000/1000 MS (Java/Others)    M ...

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

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

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

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

  4. hdu 1428 漫步校园

    http://acm.hdu.edu.cn/showproblem.php?pid=1428 dijstra+dp; #include <cstdio> #include <queu ...

  5. HDOJ 1428 漫步校园

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. 搜索专题: HDU1428漫步校园

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. Hdu428 漫步校园 2017-01-18 17:43 88人阅读 评论(0) 收藏

    漫步校园 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submissi ...

  8. HDU 1428

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. hdu 1428(很好的一道题,最短路+记忆化搜索)

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. vue-property-decorator vue typescript写法

    什么是Typescript TypeScript 是一种由微软开发的自由和开源的编程语言,它是 JavaScript 的一个超集,扩展了 JavaScript 的语法.作者是安德斯大爷, Delphi ...

  2. Android图片的缩放效果

    一.概述 Android 图片要实现:手势滑动,双击变大,多点触控的效果. 其实是有一定难度的,我们需要用Matrix ,GestureDetector 等等需要完成一个复杂的逻辑才能实现,然而今天我 ...

  3. Winform中对ZedGraph的曲线标签进行设置,比如去掉标签边框

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  4. [大数据学习研究] 4. Zookeeper-分布式服务的协同管理神器

    本来这一节想写Hadoop的分布式高可用环境的搭建,写到一半,发现还是有必要先介绍一下ZooKeeper这个东西. ZooKeeper理念介绍 ZooKeeper是为分布式应用来提供协同服务的,而且Z ...

  5. 自定义JDBC工具类(配置文件)

    import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql. ...

  6. CTC安装及其错误解决办法:binding.cpp:92:49: error: cannot convert ‘THCudaTensor*’ to ‘const THFloatTensor*’ for argument ‘1’ to ‘int64_t THFloatTensor_size(const THFloatTensor*, int)’

    CTC安装: 1. 在终端执行命令:git clone https://github.com/SeanNaren/warp-c) (效果如下图,大家不用管我前面括号的内容,那是我打开的虚拟环境) 2. ...

  7. 认识HTML和CSS

    1.认识HTML标记 HTML的全称是Hyper text markup language,超文本标记语言,用于定义文档的内容结构.在HTML中,所有的标记都是成对出现的. <html>标 ...

  8. 睡梦中被拉起来执行Spring事务

    梦中惊醒 在Tomcat的线程池里,有这样一个线程,自打出生后,从来不去干活儿,有好多次走出线程池“这座大山”去看世界的机会,都被他拱手让给了弟兄们. 弟兄们给他取了个名字叫二师兄.没错,好吃懒做,饱 ...

  9. [STL] Implement "map", "set"

    练习热身 Ref: STL中map的数据结构 C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Re ...

  10. MySQL性能优化以及常用命令

    1.将查询操作SELECT中WHERE条件后面和排序字段建立索引 2.按需查询,需要哪个字段就查哪个字段,禁止使用"SELECT * " 3.数据库引擎最好选用InnoDB,少用M ...