hdu1428(记忆化搜索+DFS)
来源:互联网 发布:半钢子午胎数据 编辑:程序博客网 时间:2024/05/19 23:14
漫步校园
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2250 Accepted Submission(s): 646
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
31 2 31 2 31 2 331 1 11 1 11 1 1
Sample Output
16
Author
LL
依题意,若A能到达B,当且仅当A到终点的最短路径大于B到终点的最短路径。
本题可以首先BFS求得求得终点到达各点的最短路径,然后在此基础上DFS求解,注意记忆化搜索避免重复。
#include<iostream>#include<vector>#include<queue>using namespace std;#define INF 1<<31-1#define MAX 50+10int n;bool visited[MAX][MAX];int g[MAX][MAX];__int64 dp[MAX][MAX];int dis[MAX][MAX];int move[4][2]={{-1,0},{1,0},{0,1},{0,-1}};//int visited[]struct node{ int x; int y;};void bfs(){ int i; node a,b; a.x=n-1; a.y=n-1; queue<node>q; q.push(a); while(!q.empty()) { a=q.front(); q.pop(); visited[a.x][a.y]=false; for(i=0;i<4;i++) { b.x=a.x+move[i][0]; b.y=a.y+move[i][1]; if(b.x>=0&&b.x<n&&b.y>=0&&b.y<n&&dis[b.x][b.y]>dis[a.x][a.y]+g[b.x][b.y]) { dis[b.x][b.y]=dis[a.x][a.y]+g[b.x][b.y]; if(!visited[b.x][b.y]) { visited[b.x][b.y]=true; q.push(b); } } } }}__int64 dfs(int a,int b){ if(dp[a][b]) return dp[a][b]; for(int i=0;i<4;i++) { int tx=a+move[i][0]; int ty=b+move[i][1]; if(tx>=0&&tx<n&&ty>=0&&ty<n&&dis[a][b]>dis[tx][ty]) dp[a][b]+=dfs(tx,ty); } return dp[a][b];}int main(){ int i,j; while(scanf("%d", &n)!=EOF) { for(i=0;i<n;i++) for(j=0;j<n;j++) { scanf("%d", &g[i][j]); // f[i][j]=0; dis[i][j]=INF; } dis[n-1][n-1]=g[n-1][n-1]; bfs(); memset(visited,0,sizeof(visited)); memset(dp,0,sizeof(dp)); dp[n-1][n-1]=1; printf("%I64d\n",dfs(0, 0)); } return 0;}
- hdu1428(记忆化搜索+DFS)
- HDU1428(BFS+DFS+记忆化搜索)
- hdu1428 记忆化搜索
- hdu1428 spfa+记忆化搜索
- hdu1428(spfa与记忆化搜索)
- hdu1428记忆化搜索加最短路
- hdu1428漫步校园( 最短路+BFS(优先队列)+记忆化搜索(DFS))
- DFS记忆化搜索(1181)
- hdu1428 BFS+记忆化搜素
- hdu1978How many ways (记忆化搜索+DFS)
- POJ 1088 滑雪 DFS 记忆化搜索
- poj 1088 DFS+记忆化搜索
- AOJ 455 DFS+记忆化搜索
- POJ 1088 滑雪 DFS 记忆化搜索
- poj 1088 滑雪 【记忆化搜索】+【DFS】
- How many ways(dfs+记忆化搜索)
- HDU-1501 Zipper DFS+记忆化搜索
- poj1088滑雪(dfs+记忆化搜索、备忘录)
- Apache+tomcat
- object-c的Retain and Release(保留与释放)
- sgu - 276 - Andrew's Troubles
- JavaWeb学习之道:文件上传和下载
- 如何在VC中查询中文,及QT5的中文处理
- hdu1428(记忆化搜索+DFS)
- 树控件 教程 超详细 (建议边看边做,加深理解,做一遍,顶看五遍,还不费劲)
- C#定时器
- BloomFilter简介
- sizeof
- WinServer 2008 发布Office文件不能访问问题
- C/C++语言void及void指针深层探索
- 部分和问题---多重部分和问题---动态规划
- Centos 安装nginx