状态压缩 状态压缩——预备知识 状态压缩——预备知识 位运算的特殊应用 and: 用以取出一个数的某些二进制位 取出一个数二进制中的最后一个1(lowbit):x-x or :将一个数的某些位设为1 not:间接构造一些数:~0u=4294967295=232-1 xor: 不使用中间变量交换两个数: a=a^b; b=b^a; a=a^b; 将一个数的某些位取反 状态压缩——引例 在n*n(n≤20)的方格棋盘上放置n个车(可以攻击所在行、列),求使它们不能互相攻击的方案总数。 状态压缩——引例 我们一行一行放置,则第一行有n种选择,第二行n-1,……,最后一行只有1种选择,根据乘法原理,答案就是n! 另外一种解法:状态压缩递推(States Compressing Recursion,SCR) 状态压缩——引例解法 我们仍然一行一行放置。 取棋子的放置情况作为状态,某一列如果已经放置棋子则为1,否则为0。这样,一个状态就可以用一个最多20位的二进制数表示。 例如n=5,第1、3、4列已经放置,则这个状态可以表示为01101(从右到左)。设fs为达到状态s的方案数,则可以尝试建立f的递推关系。 状态压缩——引例解法 考虑n=5,s=01101 因为我们是一行一行放置的,所以当达到s时已经放到了第三行。又因为一行能且仅能放置一个车,所以我们知道状态s一定来自: 状态压缩——引例解法 ①前两行在第3、4列放置了棋子(不考虑顺序,下同),第三行在第1列放置; ②前两行在第1、4列放置了棋子,第三行在第3列放置; ③前两行在第1、3列放置了棋子,第三行在第4列放置。 状态压缩——引例解法 这三种情况互不相交,且只可能有这三种情况,根据加法原理,fs应该等于这三种情况的和。写成递推式就是: 状态压缩——引例解法 根据上面的讨论思路推广之,得到引例的解决办法: 状态压缩——引例的实现 状态压缩——例1 在n*n(n≤20)的方格棋盘上放置n个车,某些格子不能放,求使它们不能互相攻击的方案总数。 状态压缩——例1分析 引例的算法是在枚举当前行(即s中1的个数,设为r)的放置位置(即枚举每个1) 而对于例1,第r行可能存在无法放置的格子,怎么解决? 状态压缩——例1解法 事实上,我们并不需要对引例的算法进行太大的改变,只要在枚举s中的1的时候判断一下是否是不允许放置的格子即可 我们用ar表示第r行不允许放置的情况,如果第r行某一位不允许放置则ar此位为0,否则为1,这可以在读入数据阶段完成 状态压缩——例1解法 然后对于需要处理的状态s,用ts=sar来代替s进行枚举,即不枚举s中的1转而枚举ts中的1。 因为ts保证了不允许放置的位为0,这样就可以不用其它的判断来实现算法 代码中只增加了计算a数组和r的部分,而时间复杂度没有变化。 状态压缩——对例1的思考 我们直接套用引例的算法就使得看上去更难的例1得到了解决。 如果再对例1进行推广,要在m*n的棋盘上放置k个车。 状态压缩——例2 有一个n*m的棋盘(n、m≤80,n*m≤80)要在棋盘上放k(k≤20)个棋子,使得任意两个棋子不相邻。求合法的方案总数 状态压缩——例2分析 9*9=8180,即如果n,m都大于等于9,将不再满足n*m≤80这一条件。所以,我们有n或m小于等于8,而28是可以承受的! 状态压缩——例2分析 我们假设m≤n,n是行数m是列数,则每行的状态可以用m位的二进制数表示 但是本题和例1又有不同:例1每行每列都只能放置一个棋子,而本题却只限制每行每列的棋子不相邻 上例中枚举当前行的放置方案的做法依然可行。我们用数组s保存一行中所有的num个放置方案,则s数组可以在预处理过程中用DFS求出,同时用ci保存第i个状态中1的个数以避免重复计算 状态压缩——例2分析 开始设计状态。本题状态的维数需要增加,原因在于并不是每一行只放一个棋子,也不是每一行都要求有棋子,原先的表示方法已经无法完整表达一个状态。 我们用fi,j,k表示第i行的状态为sj且前i行总共放置k个棋子(下面用pn代替原题中的k)的方案数。沿用枚举当前行方案的做法,只要当前行的放置方案和上一行的不冲突。微观地讲,就是要两行的状态s1和s2中没有同为1的位即可,亦即s1s2=0 状态压缩——例2解法 然而,虽然我们枚举了第i行的放置方案,但却不知道其上一行(第i-1行)的方案 为了解决这个问题,我们不得不连第i-1行的状态一起枚举,则可以写出递推式: 状态压缩——例2解法 本题至此基本解决。当然,实现上仍有少许优化空间,例如第i行只和第i-1行有关,可以用滚动数组节省空间。 这个算法时间复杂度O(n*pn*num2),空间复杂度(滚动数组)O(pn*nu
您可能关注的文档
- 地下工程施工之辅助工法.ppt
- 居室装饰风格欣赏.ppt
- 居住空间装饰设计.ppt
- 装饰墙布相关.ppt
- 托运订舱程序图解.ppt
- 计算机属性相关.ppt
- PID编程相关知识.ppt
- 艺术鉴赏相关.pptx
- 马来播棋(CONGKAK).pptx
- 罗马艺术相关.pptx
- 2026年中国窗饰产品市场全景调查与市场供需预测报告.docx
- 2026年中国船舶水下清洗行业深度研究报告:市场需求预测、进入壁垒及投资风险.docx
- 2026年中国船用绞车行业运行态势及十五五盈利前景预测报告.docx
- 2026年中国橱柜行业深度调研报告.docx
- 2026年中国船用绞车市场深度调研及投资前景战略分析报告.docx
- 2026年中国船用配套设备市场发展策略及投资潜力可行性预测报告.docx
- 2026年中国储能材料行业运营态势与投资前景预测分析报告.docx
- 2026年中国储氢材料行业运营现状及发展规划分析报告.docx
- 2026年中国传真机市场深度研究及投资前景咨询报告.docx
- 2026年中国储能变流器(PCS)产业深度评估与发展前景趋势分析研究报告.docx
最近下载
- GB/T 4340.1-2024金属材料 维氏硬度试验 第1部分:试验方法.pdf
- 高血压病人的护理(PPT).pptx VIP
- IEC 62446-1(中文版)光伏检测标准.pdf VIP
- 带头固本培元、增强党性方面存在的问题及下一步整改措施(“五个带头”8篇精选).docx VIP
- 呼吸机相关性肺炎的预防措施.ppt VIP
- 建筑电气工程《建筑工程施工工艺规程》山东省工程建设标准.doc VIP
- 2019年基金法律法规真题2.docx VIP
- 四年级语文下册《挑山工》教学设计.doc VIP
- 2019年基础医学知识竞赛练习题(5)其他医科组.docx VIP
- 2026年党建工作要点.pdf VIP
原创力文档

文档评论(0)