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

题目地址:HDU 1428

先用BFS+优先队列求出所有点到机房的最短距离,然后用记忆化搜索去搜。

代码如下:

#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const double eqs=1e-9;
const int MAXN=50+10;
int d[MAXN][MAXN], mp[MAXN][MAXN], vis[MAXN][MAXN], n;
LL dp[MAXN][MAXN];
int jx[]={0,0,1,-1};
int jy[]={1,-1,0,0};
struct node
{
        int x, y, step;
        bool operator < (const node &tmp) const{
                return tmp.step<step;
        }
};

void bfs()
{
        node f1, f2;
        f1.x=n-1;
        f1.y=n-1;
        f1.step=mp[n-1][n-1];
        d[n-1][n-1]=mp[n-1][n-1];
        vis[n-1][n-1]=1;
        priority_queue<node>q;
        q.push(f1);
        while(!q.empty()){
                f1=q.top();
                q.pop();
                for(int i=0;i<4;i++){
                        f2.x=f1.x+jx[i];
                        f2.y=f1.y+jy[i];
                        if(f2.x>=0&&f2.x<n&&f2.y>=0&&f2.y<n&&!vis[f2.x][f2.y]){
                                vis[f2.x][f2.y]=1;
                                f2.step=f1.step+mp[f2.x][f2.y];
                                d[f2.x][f2.y]=f2.step;
                                q.push(f2);
                        }
                }
        }
}
LL dfs(int x, int y)
{
        int i, a, b;
        if(dp[x][y]) return dp[x][y];
        for(i=0;i<4;i++){
                a=x+jx[i];
                b=y+jy[i];
                if(a>=0&&a<n&&b>=0&&b<n&&d[a][b]<d[x][y]){
                        dp[x][y]+=dfs(a,b);
                }
        }
        return dp[x][y];
}
int main()
{
        int i, j;
        while(scanf("%d",&n)!=EOF){
                for(i=0;i<n;i++){
                        for(j=0;j<n;j++){
                                scanf("%d",&mp[i][j]);
                        }
                }
                memset(dp,0,sizeof(dp));
                memset(vis,0,sizeof(vis));
                bfs();
                dp[n-1][n-1]=1;
                printf("%I64d\n",dfs(0,0));
        }
        return 0;
}
时间: 2024-10-10 20:49:01

HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)的相关文章

hdu 1428 漫步校园 (最短路+记忆化搜索)

漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3023    Accepted Submission(s): 917 Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每次从寝室到机房的时间,在校园里散散步.整个HDU校园呈方形布局,可划

HDU 1428 漫步校园 (BFS + 记忆化搜索)

漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3360    Accepted Submission(s): 1009 Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每次从寝室到机房的时间,在校园里散散步.整个HDU校园呈方形布局,可

Zoj 1671 Walking Ant(BFS+优先队列||记忆化搜索)

Walking Ant Time Limit: 2 Seconds Memory Limit: 65536 KB 点击打开链接 Ants are quite diligent. They sometimes build their nests beneath flagstones. Here, an ant is walking in a rectangular area tiled with square flagstones, seeking the only hole leading to

HDU 1428 漫步校园 特殊的最短路

HDU 1428 漫步校园 特殊的最短路 题意 这里需要读懂题意中的一句话"另外,他考虑从A区域到B区域仅当存在一条从B到机房的路线比任何一条从A到机房的路线更近(否则可能永远都到不了机房了-)." 这句话的意思是从(1, 1)到(n, n)的所有路径中,只选择距离最短的路径,并输出最短路径的条数.就是我们找出最短距离后,看看有多少条路到达目的地是最短距离. 解题思路 从题意我们也就知道了,我们需要找出每个点到目的地的最短路是多少.这里我们最先想到的就是一些最短路的算法了,比如Dijk

HDU 4960 Another OCD Patient(记忆化搜索)

HDU 4960 Another OCD Patient 题目链接 记忆化搜索,由于每个碎片值都是正数,所以每个前缀和后缀都是递增的,就可以利用twopointer去找到每个相等的位置,然后下一个区间相当于一个子问题,用记忆化搜索即可,复杂度接近O(n^2) 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF = 0x3f3f3f

HDU 1208 Pascal&#39;s Travels( 记忆化搜索)

题目大意:每一小格代表能向右或者向下走几步,问从左上走到右下总共有多少种走法. dp[i][j]存放该格子有多少总走法. #include <iostream> #include <cstring> using namespace std; int n; char a[40][40]; int s[40][40]; __int64 dp[40][40]; int X[]={1, 0}; int Y[]={0, 1}; __int64 dfs(int x, int y) { if(d

HDU 1331 Function Run Fun (基础记忆化搜索)

Function Run Fun Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2602    Accepted Submission(s): 1263 Problem Description We all love recursion! Don't we? Consider a three-parameter recursive f

HDU 2089 不要62(数位dp&amp;记忆化搜索)

题目链接:[kuangbin带你飞]专题十五 数位DP C - 不要62 题意 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众. 不吉利的数字为所有含有4或62的号码.例如: 62315 73418 88914 都属于不吉利号码.但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列. 你的任务是,对于每次给

HDU - 6143 Killer Names(dp记忆化搜索+组合数)

题意:从m种字母中选取字母组成姓名,要求姓和名中不能有相同的字母,姓和名的长度都为n,问能组成几种不同的姓名. 分析: 1.从m种字母中选取i种组成姓,剩下m-i种组成名. 2.i种字母组成长度为n的姓-----可转换成用i种颜色给n个球染色,记忆化搜索 dfs(n,i)---用i种颜色给n个球染色的方案数 先给第1个小球涂色,有m种选择,假设涂色为color[1], 那么剩下n-1个小球: 如果继续使用color[1],则问题转化为用m种颜色给n-1个小球涂色: 如果不再使用color[1],