zoukankan      html  css  js  c++  java
  • hdu1428(记忆化搜索)

    题意:他考虑从A区域到B区域仅当存在一条从B到机房的路线比任何一条从A到机房的路线更近(否则可能永远都到不了机房了…”这句话一定要理解清楚。就是说,对于当前位置,如果下一个状态与终点的最短距离大于或者等于当前位置到终点的最短距离,那么这个下一个状态是不可取的!到此,就能明白,此题就是求出所有点与终点的最短距离,然后再从起点进行记忆化搜索。

    这道题目值得注意,它有用广搜的dj,很有用的一个东东......

    用广搜实现的dj,如果是用一般的dj,会发现构图很麻烦,因为它不是路径带权值,而是自身带权值。写起来只要注意,在点出队列的生活将其标记为0,在要压入队列的时候,判断其标记是否为0,为0表示队列中木有这个点,则压入........

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    typedef __int64 ss;
    #define maxx 100000000
    struct node
    {
    	ss x,y;
    };
    ss n,t[4][2]={1,0,-1,0,0,1,0,-1};
    ss dis[100][100],vist[100][100],dp[100][100],a[100][100];
    void dj()
    {
    	queue<node>q;
    	for(ss i=0;i<=n;i++)
    	for(ss j=0;j<=n;j++)
    	dis[i][j]=maxx;
    	dis[n][n]=a[n][n];
    	memset(vist,0,sizeof(vist));
    	vist[n][n]=1;
    	node tmp;
    	tmp.x=n;
    	tmp.y=n;
    	q.push(tmp);
    	while(!q.empty())
    	{
    		node tmp1=q.front();
    		q.pop();
    		vist[tmp1.x][tmp1.y]=0;
    		for(ss i=0;i<4;i++)
    		{
    			ss xx=tmp1.x+t[i][0];
    			ss yy=tmp1.y+t[i][1];
    			if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&dis[xx][yy]>dis[tmp1.x][tmp1.y]+a[xx][yy])
    			{
    				dis[xx][yy]=dis[tmp1.x][tmp1.y]+a[xx][yy];
    				if(!vist[xx][yy])
    				{
    					node tmp2;
    					tmp2.x=xx;
    					tmp2.y=yy;
    					q.push(tmp2);
    					vist[xx][yy]=1;
    				}
    			}
    		}
    	}
    }
    ss dfs(ss x,ss y)
    {
    	ss ans=0;
    	if(!dp[x][y])
    	{
    		for(ss i=0;i<4;i++)
    		{
    			ss xx=x+t[i][0];
    			ss yy=y+t[i][1];
    			if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&dis[xx][yy]<dis[x][y])
    			{
    				ans+=dfs(xx,yy);
    			}
    		}
    		dp[x][y]=ans;
    	}
    	return dp[x][y];
    }
    int main()
    {
    	while(scanf("%I64d",&n)>0)
    	{
    		for(ss i=1;i<=n;i++)
    		for(ss j=1;j<=n;j++)
    		scanf("%I64d",&a[i][j]);
    		dj();
    		//for(int i=1;i<=n;i++)
    		//for(int j=1;j<=n;j++)
    		//printf("%I64d	",dis[i][j]);
    		memset(dp,0,sizeof(dp));
    		dp[n][n]=1;
    		ss sum=dfs(1,1);
    		printf("%I64d
    ",sum);
    	}
    	return 0;
    }
    
  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/ziyi--caolu/p/3198395.html
Copyright © 2011-2022 走看看