状态压缩动态规划浅谈PPT课件下载推荐.ppt
《状态压缩动态规划浅谈PPT课件下载推荐.ppt》由会员分享,可在线阅读,更多相关《状态压缩动态规划浅谈PPT课件下载推荐.ppt(32页珍藏版)》请在冰豆网上搜索。
nn最优子结构性质:
要求问题的最优策略的子策略也是最优。
基本知识nn状态压缩动态规划的使用动机:
nn一般的状态描述不满足无后效性原则,或者保存的信息不足够进行决策。
nn将当前一部分局面信息压缩存储,结合常见的一些局面描述,使得构成的状态满足无后效性原则基础知识nn名称:
基于状态压缩的动态规划、集合动态规划。
nn含义:
以一个集合内的元素信息作为状态,状态总数为指数级别的动态规划。
nn特点:
nn1、本身要满足动态规划的性质:
最优性原理、无后效性。
nn2、数据某几维规模比较小。
传统集合动态规划nn例题一:
nn给定n个点的有向带权图,求一条经过每个点一次的回路,并要求权和最小。
nn范围n=15。
传统集合动态规划nn显然对于某一个中间状态,影响它的最后结果的仅仅是当前所在点以及之前已经经过的点。
而之前的路径行走情况与之后的解无关。
nn状态Fi,opt,i表示当前所在点,opt是用2进制记录每个点是否已经经过。
传统集合动态规划nn例题二:
炮兵阵地(NOI2001)nn在N*M网格地图上部署炮兵部队。
每个炮兵可以控制横纵2格范围。
任意一对炮兵互相不能处于控制范围。
nn地图上有些点不能部署部队。
nnN=100;
M=10。
传统集合动态规划nn例题三:
K-排列问题nn考虑一个1n的排列a1,a2,a3an,若max(abs(ai-i)=K,那么这个排列就称为K-排列。
nn求n个数的K-排列的个数。
nn范围:
n=100,K=5传统集合动态规划nn例题四:
生成树计数(NOI2007)nn环状图,任意两个点距离不超过k则连边,求生成树个数。
nnK=5实现nn插头法nn转移的复杂度降低nn时间复杂度降低传统集合动态规划nn例题AnotherChocolateManiac(Sgu132)nn给定一个M*N的网格,网格中存在一些障碍物。
在网格空地处放置最少的1*2的矩形块,使得网格中无法再放入1*2的矩形块。
nn1=M=70nn1=N=7基于连通性的状态压缩动态规划nn在网格中寻找一条或多条路径(回路)满足一定的条件,求方案数或路径总长度最短。
nn状态除了记录路径“出口”,还要记录其连通性。
基于连通性的状态压缩动态规划nn例题一:
Formula1(Ural1519)nn给你一个m*n的棋盘,有的格子是障碍,问共有多少条回路使得经过每个非障碍格子恰好一次nnm,n12基于连通性的状态压缩动态规划nn思想:
状态压缩动态规划。
nn一个单元格中可能出现的路径情况:
实现细节nn总体实现:
插头法总体实现:
插头法nn实现方法:
记忆化搜索实现方法:
记忆化搜索nnFi,j,optFi,j,opt表示当前是表示当前是ii行行jj列,最后扫描的总共列,最后扫描的总共mm个个格子的状态为格子的状态为optopt的方案数。
的方案数。
nnOptOpt的记录:
的记录:
mm个格子向下伸出插头的情况,以及个格子向下伸出插头的情况,以及最后一个格子向右伸出插头的情况。
最后一个格子向右伸出插头的情况。
nn插头记录:
插头记录:
00表示无插头,具体数字表示插头的属表示无插头,具体数字表示插头的属性(染色法记录属于第几个连通块,最小表示)。
性(染色法记录属于第几个连通块,最小表示)。
对于本题最多同时存在对于本题最多同时存在66个连通块的插头。
个连通块的插头。
实现细节nn转移:
分类讨论插头方向。
转移:
nn11、当前格上方左方均有插头:
只能将这两个连通、当前格上方左方均有插头:
只能将这两个连通块连接。
(块连接。
(11种)种)nn22、当前格只有上方有插头:
将这个插头向下向右、当前格只有上方有插头:
将这个插头向下向右延伸。
(延伸。
(22种)种)nn33、当前格只有左方有插头:
将这个插头向下向右、当前格只有左方有插头:
(22种)种)nn44、当前格周围无插头:
若当前格为障碍物,则无、当前格周围无插头:
若当前格为障碍物,则无插头,否则插入一个折线形插头。
插头,否则插入一个折线形插头。
实现细节nn合并连通块:
合并连通块:
nn对于第一种情况,需要合并连通块。
若不加限制,对于第一种情况,需要合并连通块。
若不加限制,则会计算出包含多条回路的情况。
则会计算出包含多条回路的情况。
nn限制:
和并连通块时,若两个插头属于同一个连限制:
和并连通块时,若两个插头属于同一个连通块,则当且仅当在最后一个有效格子中可以将通块,则当且仅当在最后一个有效格子中可以将这两个插头连接。
这两个插头连接。
nn最后统计:
计算到最后一个有效格子时,需要统最后统计:
计算到最后一个有效格子时,需要统计答案。
此时,要保证当前状态没有剩余的插头。
计答案。
实现细节nn一些可能存在的问题:
nn直接开数组用序列记录插头好还是把状态压缩后记录好?
nn最小表示的如何实现?
nn如何减小常数?
实现细节nn一个优化:
nn若当前格子连出的插头指向一个障碍物格子,可以直接剪枝。
nn对有障碍的情况,能减少很多无效状态。
基于连通性的状态压缩动态规划nn例题二:
ManhattanWriting(Japan2006)nnn*m网格有一些障碍,要求把两个2和两个3分别用折线连起来,总长度尽量小。
nnn,m=9基于连通性的状态压缩动态规划nn主体思想与之前相同。
nn不同点:
nn需要专门两种属性记录与数2和数3的连通插头。
nn无需考虑多余回路情况。
(解肯定劣)状态压缩动态规划中的剪枝nn状态数是指数级别。
nn最小表示以减少状态数。
nn根据题目尽可能早地删去不可能成为最优的状态或不可行的状态。
状态压缩动态规划中的剪枝nn例题:
中国烟花例题:
中国烟花(zju2125zju2125)nn给你一个给你一个9*69*6的棋盘,棋盘的左边的棋盘,棋盘的左边有有99根火柴,右边有根火柴,右边有99个火箭棋盘个火箭棋盘中的每一个格子可能是一个空格子中的每一个格子可能是一个空格子也可能是一段管道,管道的类型有也可能是一段管道,管道的类型有44种:
种:
LL型,一型,型,一型,TT型,十型。
型,十型。
nn给定棋盘的初始状态以及给定棋盘的初始状态以及XX,你的目,你的目标是旋转每个格子内的管道标是旋转每个格子内的管道00,9090,180180或或270270度,使得当点燃左边第度,使得当点燃左边第XX根根火柴后,被发射的火箭个数尽可能火柴后,被发射的火箭个数尽可能多。
多。
状态压缩动态规划中的剪枝nn状态:
按照从左到右,从上到下的顺序依次考虑每一个格子,记录每个插头是否已经点燃以及它们之间的连通情况。
nn状态为:
Fi,j,opt,fired表示转移完(i,j),最后扫描的总共10个插头的连通性为opt(把每个插头是否存在记录在opt中),10个插头是否被点燃的2进制数fired的状态能否达到。
状态压缩动态规划中的剪枝nn转移:
依次枚举每一个格子的旋转方式(最多4种),根据当前格子是否可以与上面的格子和左边的格子通过插头连接起来分情况讨论。
nn状态数太多,直接做TLE。
nn怎么办?
状态压缩动态规划中的剪枝nn剪枝一:
如果当前状态所有的插头全部都未被点燃,那么最后所有的火箭都不可能发射,所以这个状态可以舍去。
一个显然的剪枝,却能剪掉近乎一半的状态。
nn剪枝二:
如果轮廓线上有一个插头p,它没有被火柴点燃且没有其它的插头与它连通,那么这个插头可以认为是“无效”插头。
这个状态可以剪枝。
(必然存在不存在这个“无效”插头的状态)状态压缩动态规划中的剪枝nn剪枝三:
对于一个格子(i,j)的两个状态(opt1,fired1)(opt2,fired2),如果第一个状态的每一个存在的插头在第二个状态中不仅存在而且都被点燃,那么第一个状态可以剪枝。
(一个状态必然不比第二个状态优)nn剪枝四:
边界状态,判断无效状态并剪枝。
练习nnBetsy的旅行(USACO)nn给定一个N*N的网格(N=9),要求从左上角的格子走到左下角的格子,并且经过所有格子恰好一次。
nn求Betsy能采用的路径方案数练习nYouthHostelDorm(Nwerc2007)n在一个n*m的网格旅馆中,边界上有唯一的门。
除了门之外,其余的格子要么是空地,要么是床。
一张床可访问到,当且仅当他相邻格子中有一个空地格子所在连通块是门所在的连通块,n问最多能访问到多少张床。
n范围:
n,m=8练习nnTheFloorBricks(Pku2285)nn给定一个5行n列的空间,要求填入给定的m种方块(大小均不超过3*3)。
nn求最少需要多少个方块。