首页 > 代码库 > 北大ACM暑期培训课程目录(二)

北大ACM暑期培训课程目录(二)

本文出自:http://blog.csdn.net/svitter


原来的一篇可能是因为字数太长,一编辑就出问题,无奈,只好暂时写一篇新的。

今天学习的内容是搜索。

一.wide search

    1.poj3307 cow
        深度搜索还要用栈。
        广度搜速度更快。
        按照层次的顺序访问节点。
        走n步可以到达的点,n-1不可以到达。绝对是最优解。
        可以联系图来想——周围区域扩展。
        re记住已经走过的点(如果转换成树呢?)
        利用队列来存点。
        广搜的空间大,深搜可以用一个栈来维护。(相对于广搜空间少的多)

        open表中。指向父节点的指针。(达到目标最少要走多少步。用层次编号来求。)
        队头的节点是目标节点,搜索完成。可以倒序输出路径。

    注意:
       1.判重复的标记。
       2.层级编号
       3.利用STL<queue>

    poj3984迷宫
        求最短到达迷宫口的路径。
        从队头取出状态来扩展。扩展过(visit=0)则步扩展
        基本是相同的题目。
        可以利用递归来输出路径(即栈)。
        改变队列头的位置,但是并不是删除队列中的元素。
    

    以上基本为数据结构的内容。

    BL 4980
        迷宫变种。
        类似于魔塔。
        队列为空时结束,在数据结构中存一个时间变量。
        把x扩展为可消除的点,第一次遇见扩展出改变。相当于扩展空间。

    bl6044鸣人佐助。
        花费量。花费最为有效的查克拉。
        什么状态。都是强调状态。迷宫问题状态是xy,对于不同的标记不同。
        简单的标记无法解决问题
        类似动规

        r, c, k所在行列,查克拉的数量。
        可以对应的状态变幻。

    求钥匙的鸣人
        需要集齐k种钥匙。必须集齐K种钥匙才能救佐助。(1年级期末考试题目,程序设计实习)

    POJ1729
        jack,jill想距离最远。
        两个人最近的直线距离最远。
        移动结束以后距离最远,不考虑移动过城中的距离。
        状态:一对格子是一个状态。
            给一个限制条件,观察是否可以走到。
            假设一个限制条件。枚举k看是否满足。
            枚举所有的距离k。
            求k的最大值。
            深搜可能会慢一点,光搜应该会快。
            利用二分法查找来寻找一个更合适的值。(经典!线性的搜索)。
        最近的最远距离。
        注意:
            格子队的判重问题。
            个人的重复走问题。
            利用标记判重。

    POJ1077八数码
        人工智能的经典问题
        也是强调状态。
        局面是一个状态。
        状态压缩方法。
        状态树。(一个比较好的方式去记录)
      * 通性:状态的判重。
        状态曾经出现过(不就是动规的子状态么)
        一共9!
        直到找到目标状态。
        能是o(1)最佳。

        状态的压缩表示。**数字的敏感性。
        每一个状态对应一个9位数。
        int 可以表示一个状态。
        标志位的序列。一个元素8bit一个需要。。。

        减少标志位的存储空间。状态数目只有9!
        每个状态空座0-8的一个排列。
        每一个排列作为一个序号。
        计算出排列序号x,数组小表就是a[x/8]的第x%8位。

       *给定一个序号求排列。
        状态数字大小,时间的均衡。
        
        作是否有解的判定。
       *奇排列无法转换成为偶排列。(离散数学)
        移动0的位置,不会改变数列的奇偶性。可以证明。
        
        POJ数据只有1组。hdu有多组数据。
        bitset<STL>
    2.compare dfs and bfs

    3.双向广搜
        DBFS是一种扩展。
        利用两个队列。
    *   一个扩展队列已经扩展过,则可以停下了。
        两头搜索。
        
        为何要快呢?
            扩展出的总节点数目要少。
                单向搜索要m层才能找到答案,总的节点书目(1-n^m)/(1-n)
            双向广搜,同样是一共扩展m曾。两边各扩展出m/2层
                则总结点数目2*(1-n^m-2)/(1-n)
    *   选择节点较少的那边进行扩展。



    4.A*算法
        启发式搜索算法的一种
        每个状态n都会有一个估价函数。
        优先考虑f值小额节点。
        g(n)从其是状态到状态n的代价(不一定是最优的).
        h(n)估计代价。
      * 对估价函数进行特定限制,来确保知道最优解。
        注意:
            1.h(n)相容。
            2.g(n)>=g*(n),g(n)>0
            3.h(n)>=h*(n);
        set:
            multiset<>平衡二叉树
        hdu3000MS过的。比双向广搜慢。

        人工智能中的博弈*(可能状态数目太多)
    
    5.迭代加深搜索算法,也会重复搜索
    6.IDA*加深的A*算法
        poj2286
     

    
二.深搜剪枝

    1.

北大ACM暑期培训课程目录(二)