点击查看详情——《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 }