状态压缩动态规划(压缩状态DP)学习笔记

  1. 状态压缩动态规划是什么?

    顾名思义,我们从压缩状态和动态规划两个方面来讨论。

    1. 状态压缩

      1. 什么是?

        就是使用某种方法,简明扼要地以最小代价来表示某种状态,通常是用一串01数字(二进制数)来表示各个点的状态。这就要求使用状态压缩的对象的点的状态必须只有两种,0 或 1;当然如果有三种状态用三进制来表示也未尝不可。

      2. 为什么要?

        对于那些具有状态的点的数量比较少的问题,其实直接用二维数组来表示点的位置即可,但是当点不那么少,并且需要反复表示此前所有点的状态时,用二维数组会带来更大的空间和时间复杂度。用状态压缩的方法就可以很巧妙地节省了这些空间。

        ·比如:

                下面有4个城市ABC,去其他城市的代价根据到过的城市不同而不同,第一次出发代价为零。

                到过城市  |  再到其他城市花费

                      A       |         1                

                      B       |         2                

                      C       |         3                

                      AB     |         4                

                      AC     |         5                

                      BC     |         6                

                我们应该怎么记录张表呢?方法当然有很多,但是比较方便的是用一个3位的二进制数来表示,这样只需要一个长度为8的数组即可以存下这个表(从左往右分别表示C B A , 0 没去过,1去过):f(000) = 0, f(001) = 1, f(010) = 2, f(100) = 3 ......f(110) = 6; 换种写法就是f[0] = 0, f[1] = 1, f[2] = 2, f[4] = 3,...f[6] = 6 。

      3. 有什么用 && 怎么用?

        作用显而易见,降低储存的空间,同时配合位运算可以很方便地检查各点状态。

        使用只要明确有哪些位置,状态有多少种,考虑清楚怎么运算即可。

    2. 动态规划

      动态规划是个大问题,这里就不详述,只谈谈这种情况下的动态规划与普通的动态规划区别在哪里。

      动态规划问题通常有两种,一种是对递归问题的记忆化求解,另一种是把大问题看作是多阶段的决策求解。这里用的便是后一种,这带来一个需求,即存储之前的状态,再由状态及状态对应的值推演出状态转移方程最终得到最优解。


  2. 实例

    1. SJTUOJ 1088 小F的邮递员(旅行商问题)

  3. 优化?

    待想><





你可能感兴趣的:(状态压缩动态规划(压缩状态DP)学习笔记)