漫步校园

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. 【编程之美】用C语言实现状态机(实用)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/lihuidashen/p/115105 ...

  2. 小白的消费为何被迫升级?-java数据类型的转换

    背景 小白最近有点烦恼,原因也很简单,不知道为何?小白的消费不知不觉被迫升级了,请看费用清单: for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; ...

  3. PathMarker:命令行快速编辑跳转工具(配合git,find等)

    简介 当使用git, find等工具时,一般需要进一步打开文件或跳转目录. 通常的做法是使用鼠标复制黏贴,或者手工输入. PathMarker提供一种快速通过标号,编辑相关文件,跳转相关目录的方法,提 ...

  4. DevExpress的对话框XtraMessageBox的使用

    场景 在Winform中一般弹出对话框使用的是MessageBox,而在 DevExpress中使用的是XtraMessageBox实现对话框. 效果 实现 首先新建确认按钮的调用方法: public ...

  5. 算法与数据结构基础 - 图(Graph)

    图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...

  6. python+selenium十:selenium的二次封装

    python+selenium十:基于原生selenium的二次封装   from selenium import webdriverfrom selenium.webdriver.support.w ...

  7. spring中使用aop配置事务

    spring的事务配置有5种方式,这里记录其中的一种:基于tx/aop声明式事务配置 在之前spring aop介绍和示例这篇所附代码的基础上进行测试 一.添加save方法 1.在testDao类里添 ...

  8. JavaScript之基本概念(一)

    在我们学习一门编程语言之前,我们应该先了解它的一些基本概念,包括它是什么,它能用来干什么,怎么用等等.这部分内容建议学习时间一天. 一 何为‘JavaScript’ 1 .    什么是JavaScr ...

  9. JS中如何防止表单重复提交问题

    在登录页面html中写如下代码 <script type="text/javascript"> var issubmit=false; function dosubmi ...

  10. Chrome 调试AJAX请求返回的JS脚本

    有时候会使用AJAX请求加载局部的Html页面,这个时候如果想调试局部页面中的js就比较麻烦,现在暂时发现了两种方法.第一种是在js代码中想要断点的地方加debugger,这样代码执行到此处会进入断点 ...