首页 > 代码库 > HDU - 1428【bfs+记忆化】

HDU - 1428【bfs+记忆化】

点击查看详情——《IJCAI 2017 口碑商家客流量预测大赛》

漫步校园

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4205    Accepted Submission(s): 1317


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
 
题意:
找 (1,1)->(n,n)有多少种路径,每一步往下一步走的时候,满足下一步到(n, n)的距离比当前到(n, n)的距离短;
题解:
bfs预处理所有点到(n, n)的距离,然后记忆化dfs
代码:
技术分享
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <bitset>
 6 #include <vector>
 7 #include <queue>
 8 #include <stack>
 9 #include <cmath>
10 #include <list>
11 #include <set>
12 #include <map>
13 #define rep(i,a,b) for(int i = a;i <= b;++ i)
14 #define per(i,a,b) for(int i = a;i >= b;-- i)
15 #define mem(a,b) memset((a),(b),sizeof((a)))
16 #define FIN freopen("in.txt","r",stdin)
17 #define FOUT freopen("out.txt","w",stdout)
18 #define IO ios_base::sync_with_stdio(0),cin.tie(0)
19 #define mid ((l+r)>>1)
20 #define ls (id<<1)
21 #define rs ((id<<1)|1)
22 #define N 55
23 #define INF 0x3f3f3f3f
24 #define INFF ((1LL<<62)-1)
25 using namespace std;
26 typedef long long LL;
27 typedef pair<int, int> PIR;
28 const double eps = 1e-8;
29 
30 int n, G[N][N], dis[N][N], dir[4][2] = {0,1,0,-1,1,0,-1,0};
31 LL dp[N][N];
32 bool vis[N][N];
33 struct Node{
34     int x, y, c;
35     Node(int _x, int _y, int _c)    { x = _x; y = _y; c = _c; }
36     bool operator < (const Node &r) const   { return c > r.c; }
37 };
38 bool judge(int x, int y){
39     if(x < 1 || x > n || y < 1 || y > n)    return false;
40     return true;
41 }
42 void bfs(){
43     priority_queue <Node> Q;
44     mem(dis, INF);
45     mem(vis, false);
46     Q.push(Node(n, n, G[n][n]));
47     dis[n][n] = G[n][n];
48     while(!Q.empty()){
49         Node h = Q.top();
50         Q.pop();
51         int xx = h.x, yy = h.y;
52         if(vis[xx][yy]) continue;
53         vis[xx][yy] = true;
54         rep(i, 0, 3){
55             int xi = xx+dir[i][0], yi = yy+dir[i][1];
56             if(judge(xi, yi) && dis[xx][yy]+G[xi][yi] < dis[xi][yi]){
57                 dis[xi][yi] = dis[xx][yy]+G[xi][yi];
58                 Q.push(Node(xi, yi, dis[xi][yi]));
59             }
60         }
61     }
62     return ;
63 }
64 LL dfs(int x, int y){
65     if(dp[x][y])    return dp[x][y];
66     rep(i, 0, 3){
67         int xi = x+dir[i][0], yi = y+dir[i][1];
68         if(judge(xi, yi) && dis[x][y] > dis[xi][yi]){
69             dp[x][y] += dfs(xi, yi);
70         }
71     }
72     return dp[x][y];
73 }
74 int main()
75 {IO;
76     //FIN;
77     while(cin >> n){
78         rep(i, 1, n){
79             rep(j, 1, n)    cin >> G[i][j];
80 
81         }
82         bfs();
83         mem(dp, 0);
84         dp[n][n] = 1;
85         dfs(1, 1);
86         cout << dp[1][1] << endl;
87     }
88     return 0;
89 }
View Code

 

HDU - 1428【bfs+记忆化】