基于连通性状态压缩的动态规划问题

合集下载

基于连通性状态压缩的动态规划问题

基于连通性状态压缩的动态规划问题
Black & White(Uva10532)
一类最优性问题的剪枝优化
生成树计数 (NOI2007)
Questions are welcome.
THANK FOR YOU WATCHING
演讲人姓名 Thank you for listening!
总结
最小表示法
广

简单回路

括 号
拓 展

括号表示法
示 法
3进制→4进制
简单路径
括号表示法的改进
全文研究内容
一类棋盘染色问 题
Rocket Mania (Zju2125)
一类简单路径问题 Formula 1(Ural1519) Formula 2(改编自Formula 1)
一类基于非棋盘模型的问题
• 插头
一个格子某个方向的插头存在
• 表轮示廓这线个格子在这个方向与相
邻已格决子策相格连子.和未决策格子的 分界线
轮廓线上方与其相连的
有n+1个插头,包括n个
下插头和1个右插头.
• 数据规模小
棋盘模0型1 初步分析 • 问题特点:
单击此处添加标题
单击添加文本具体内容
每个插头是否存在
02 单击此处添加标题 单击添加文本具体内容
( 插头
)插头
(#) ( )
( ### )
转移时间:O(1)
有上插头和左插头 Case 2.3 左插头为(插头,上插头为)插头
Case 2
( 插头
)插头
路径的两端连接起 来形成回路
Case 3
上插头和左插头恰好有一个,这种情况相当于 延续原来的连通分量
)插头
无插头 ( ( ) # )

动态规划之状态压缩

动态规划之状态压缩

状态压缩Abstract信息学发展势头迅猛,信息学奥赛的题目来源遍及各行各业,经常有一些在实际应用中很有价值的问题被引入信息学并得到有效解决。

然而有一些问题却被认为很可能不存在有效的(多项式级的)算法,本文以对几个例题的剖析,简述状态压缩思想及其应用。

Keywords状态压缩、Hash、动态规划、递推ContentIntroducti o n作为OIers,我们不同程度地知道各式各样的算法。

这些算法有的以O(logn)的复杂度运行,如二分查找、欧几里德GCD算法(连续两次迭代后的余数至多为原数的一半)、平衡树,有的以)运行,例如二级索引、块状链表,再往上有O(n)、O(n p log q n)……大部分问题的算法都有一个多项式级别的时间复杂度上界1,我们一般称这类问题2为P (deterministic Polynomial-time)类问题,例如在有向图中求最短路径。

然而存在几类问题,至今仍未被很好地解决,人们怀疑他们根本没有多项式时间复杂度的算法,NPC(NP-Complete)和NPH(NP-Hard)就是其中的两类,例如问一个图是否存在哈密顿圈(NPC)、问一个图是否不存在哈密顿圈(NPH)、求一个完全图中最短的哈密顿圈(即经典的Traveling Salesman Problem货郎担问题,NPH)、在有向图中求最长(简单)路径(NPH),对这些问题尚不知有多项式时间的算法存在。

P和NPC都是NP(Non-deterministic Polynomial-time)的子集,NPC则代表了NP类中最难的一类问题,所有的NP类问题都可以在多项式时间内归约到NPC问题中去。

NPH包含了NPC和其他一些不属于NP(也更难)的问题,NPC问题的函数版本(相对于判定性版本)一般是NPH的,例如问一个图是否存在哈密顿圈是NPC的,但求最短的哈密顿圈则是NPH的,原因在于我们可以在多项式时间内验证一个回路是否真的是哈密顿回路,却无法在多项式时间内验证其是否是最短的,NP类要求能在多项式时间内验证问题的一个解是否真的是一个解,所以最优化TSP问题不是NP的,而是NPH的。

NOI国家集训队论文分类(至2008)(摘抄自C博客)

NOI国家集训队论文分类(至2008)(摘抄自C博客)

摘抄自C博客组合数学计数与统计2001 - 符文杰:《Pólya原理及其应用》2003 - 许智磊:《浅谈补集转化思想在统计问题中的应用》2007 - 周冬:《生成树的计数及其应用》2008 - 陈瑜希《Pólya计数法的应用》数位问题2009 - 高逸涵《数位计数问题解法研究》2009 - 刘聪《浅谈数位类统计问题》动态统计2004 - 薛矛:《解决动态统计问题的两把利刃》2007 - 余江伟:《如何解决动态统计问题》博弈2002 - 张一飞:《由感性认识到理性认识——透析一类搏弈游戏的解答过程》2007 - 王晓珂:《解析一类组合游戏》2009 - 曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问题》2009 - 方展鹏《浅谈如何解决不平等博弈问题》2009 - 贾志豪《组合游戏略述——浅谈SG游戏的若干拓展及变形》母函数2009 - 毛杰明《母函数的性质及应用》拟阵2007 - 刘雨辰:《对拟阵的初步研究》线性规划2007 - 李宇骞:《浅谈信息学竞赛中的线性规划——简洁高效的单纯形法实现与应用》置换群2005 - 潘震皓:《置换群快速幂运算研究与探讨》问答交互2003 - 高正宇:《答案只有一个——浅谈问答式交互问题》猜数问题2003 - 张宁:《猜数问题的研究:<聪明的学生>一题的推广》2006 - 龙凡:《一类猜数问题的研究》数据结构数据结构2005 - 何林:《数据关系的简化》2006 - 朱晨光:《基本数据结构在信息学竞赛中的应用》2007 - 何森:《浅谈数据的合理组织》2008 - 曹钦翔《数据结构的提炼与压缩》结构联合2001 - 高寒蕊:《从圆桌问题谈数据结构的综合运用》2005 - 黄刚:《数据结构的联合》块状链表2005 - 蒋炎岩:《数据结构的联合——块状链表》2008 - 苏煜《对块状链表的一点研究》动态树2006 - 陈首元:《维护森林连通性——动态树》2007 - 袁昕颢:《动态树及其应用》左偏树2005 - 黄源河:《左偏树的特点及其应用》跳表2005 - 魏冉:《让算法的效率“跳起来”!——浅谈“跳跃表”的相关操作及其应用》2009 - 李骥扬《线段跳表——跳表的一个拓展》SBT2007 - 陈启峰:《Size Balance Tree》线段树2004 - 林涛:《线段树的应用》单调队列2006 - 汤泽:《浅析队列在一类单调性问题中的应用》哈希表2005 - 李羽修:《Hash函数的设计优化》2007 - 杨弋:《Hash在信息学竞赛中的一类应用》Splay2004 - 杨思雨:《伸展树的基本操作与应用》图论图论2005 - 任恺:《图论的基本思想及方法》模型建立2004 - 黄源河:《浅谈图论模型的建立与应用》2004 - 肖天:《“分层图思想”及其在信息学竞赛中的应用》网络流2001 - 江鹏:《从一道题目的解法试谈网络流的构造与算法》2002 - 金恺:《浅谈网络流算法的应用》2007 - 胡伯涛:《最小割模型在信息学竞赛中的应用》2007 - 王欣上:《浅谈基于分层思想的网络流算法》2008 - 周冬《两极相通——浅析最大—最小定理在信息学竞赛中的应用》最短路2006 - 余远铭:《最短路算法及其应用》2008 - 吕子鉷《浅谈最短径路问题中的分层思想》2009 - 姜碧野《SPFA算法的优化及应用》欧拉路2007 - 仇荣琦:《欧拉回路性质与应用探究》差分约束系统2006 - 冯威:《数与图的完美结合——浅析差分约束系统》平面图2003 - 刘才良:《平面图在信息学中的应用》2007 - 古楠:《平面嵌入》2-SAT2003 - 伍昱:《由对称性解2-SAT问题》最小生成树2004 - 吴景岳:《最小生成树算法及其应用》2004 - 汪汀:《最小生成树问题的拓展》二分图2005 - 王俊:《浅析二分图匹配在信息学竞赛中的应用》Voronoi图2006 - 王栋:《浅析平面Voronoi图的构造及应用》偶图2002 - 孙方成:《偶图的算法及应用》树树2002 - 周文超:《树结构在程序设计中的运用》2005 - 栗师:《树的乐园——一些与树有关的题目》路径问题2009 - 漆子超《分治算法在树的路径问题中的应用》最近公共祖先2007 - 郭华阳:《RMQ与LCA问题》划分问题2004 - 贝小辉:《浅析树的划分问题》数论欧几里得算法2009 - 金斌《欧几里得算法的应用》同余方程2003 - 姜尚仆:《模线性方程的应用——用数论方法解决整数问题》搜索搜索2001 - 骆骥:《由“汽车问题”浅谈深度搜索的一个方面——搜索对象与策略的重要性》2002 - 王知昆:《搜索顺序的选择》2005 - 汪汀:《参数搜索的应用》启发式2009 - 周而进《浅谈估价函数在信息学竞赛中的应用》优化2003 - 金恺:《探寻深度优先搜索中的优化技巧——从正方形剖分问题谈起》2003 - 刘一鸣:《一类搜索的优化思想——数据有序化》2006 - 黄晓愉:《深度优先搜索问题的优化技巧》背包问题2009 - 徐持衡《浅谈几类背包题》匹配2004 - 楼天城:《匹配算法在搜索问题中的巧用》概率概率2009 - 梅诗珂《信息学竞赛中概率问题求解初探》数学期望2009 - 汤可因《浅析竞赛中一类数学期望问题的解决方法》字符串字符串2003 - 周源:《浅析“最小表示法”思想在字符串循环同构问题中的应用》多串匹配2004 - 朱泽园:《多串匹配算法及其启示》2006 - 王赟:《Trie图的构建、活用与改进》2009 - 董华星《浅析字母树在信息学竞赛中的应用》后缀数组2004 - 许智磊:《后缀数组》2009 - 罗穗骞《后缀数组——处理字符串的有力工具》字符串匹配2003 - 饶向荣:《病毒的DNA———剖析一道字符匹配问题解析过程》2003 - 林希德:《求最大重复子串》动态规划动态规划2001 - 俞玮:《基本动态规划问题的扩展》2006 - 黄劲松:《贪婪的动态规划》2009 - 徐源盛《对一类动态规划问题的研究》状态压缩2008 - 陈丹琦《基于连通性状态压缩的动态规划问题》状态设计2008 - 刘弈《浅谈信息学中状态的合理设计与应用》树形DP2007 - 陈瑜希:《多角度思考创造性思维——运用树型动态规划解题的思路和方法探析》优化2001 - 毛子青:《动态规划算法的优化技巧》2003 - 项荣璟:《充分利用问题性质——例析动态规划的“个性化”优化》2004 - 朱晨光:《优化,再优化!——从《鹰蛋》一题浅析对动态规划算法的优化》2007 - 杨哲:《凸完全单调性的加强与应用》计算几何立体几何2003 - 陆可昱:《长方体体积并》2008 - 高亦陶《从立体几何问题看降低编程复杂度》计算几何思想2004 - 金恺:《极限法——解决几何最优化问题的捷径》2008 - 程芃祺《计算几何中的二分思想》2008 - 顾研《浅谈随机化思想在几何问题中的应用》圆2007 - 高逸涵:《与圆有关的离散化》半平面交2002 - 李澎煦:《半平面交的算法及其应用》2006 - 朱泽园:《半平面交的新算法及其实用价值》矩阵矩阵2008 - 俞华程《矩阵乘法在信息学中的应用》高斯消元2002 - 何江舟:《用高斯消元法解线性方程组》数学方法数学思想2002 - 何林:《猜想及其应用》2003 - 邵烜程:《数学思想助你一臂之力》数学归纳法2009 - 张昆玮《数学归纳法与解题之道》多项式2002 - 张家琳:《多项式乘法》数形结合2004 - 周源:《浅谈数形结合思想在信息学竞赛中的应用》黄金分割2005 - 杨思雨:《美,无处不在——浅谈“黄金分割”和信息学的联系》其他算法遗传算法2002 - 张宁:《遗传算法的特点及其应用》2005 - 钱自强:《关于遗传算法应用的分析与研究》信息论2003 - 侯启明:《信息论在信息学竞赛中的简单应用》染色与构造2002 - 杨旻旻:《构造法——解题的最短路径》2003 - 方奇:《染色法和构造法在棋盘上的应用》一类问题区间2008 - 周小博《浅谈信息学竞赛中的区间问题》序2005 - 龙凡:《序的应用》系2006 - 汪晔:《信息学中的参考系与坐标系》物理问题2008 - 方戈《浅析信息学竞赛中一类与物理有关的问题》编码与译码2008 - 周梦宇《码之道—浅谈信息学竞赛中的编码与译码问题》对策问题2002 - 骆骥:《浅析解“对策问题”的两种思路》优化算法优化2002 - 孙林春:《让我们做得更好——从解法谈程序优化》2004 - 胡伟栋:《减少冗余与算法优化》2005 - 杨弋:《从<小H的小屋>的解法谈算法的优化》2006 - 贾由:《由图论算法浅析算法优化》程序优化2006 - 周以苏:《论反汇编在时间常数优化中的应用》2009 - 骆可强《论程序底层优化的一些方法与技巧》语言C++2004 - 韩文弢:《论C++语言在信息学竞赛中的应用》策略策略2004 - 李锐喆:《细节——不可忽视的要素》2005 - 朱泽园:《回到起点——一种突破性思维》2006 - 陈启峰:《“约制、放宽”方法在解题中的应用》2006 - 李天翼:《从特殊情况考虑》2007 - 陈雪:《问题中的变与不变》2008 - 肖汉骏《例谈信息学竞赛分析中的“深”与“广”》倍增2005 - 朱晨光:《浅析倍增思想在信息学竞赛中的应用》二分2002 - 李睿:《二分法与统计问题》2002 - 许智磊:《二分,再二分!——从Mobiles(IOI2001)一题看多重二分》2005 - 杨俊:《二分策略在信息学竞赛中的应用》调整2006 - 唐文斌:《“调整”思想在信息学中的应用》随机化2007 - 刘家骅:《浅谈随机化在信息学竞赛中的应用》非完美算法2005 - 胡伟栋:《浅析非完美算法在信息学竞赛中的应用》2008 - 任一恒《非完美算法初探》提交答案题2003 - 雷环中:《结果提交类问题》守恒思想2004 - 何林:《信息学中守恒法的应用》极限法2003 - 王知昆:《浅谈用极大化思想解决最大子矩形问题》贪心2008 - 高逸涵《部分贪心思想在信息学竞赛中的应用》压缩法2005 - 周源:《压去冗余缩得精华——浅谈信息学竞赛中的“压缩法”》逆向思维2005 - 唐文斌:《正难则反——浅谈逆向思维在解题中的应用》穷举2004 - 鬲融:《浅谈特殊穷举思想的应用》目标转换2002 - 戴德承:《退一步海阔天空——“目标转化思想”的若干应用》2004 - 栗师:《转化目标在解题中的应用》类比2006 - 周戈林:《浅谈类比思想》分割与合并2006 - 俞鑫:《棋盘中的棋盘——浅谈棋盘的分割思想》2007 - 杨沐:《浅析信息学中的“分”与“合”》平衡思想2008 - 郑暾《平衡规划——浅析一类平衡思想的应用》。

状态压缩动态规划状压DP

状态压缩动态规划状压DP

状态压缩动态规划状压DP总述状态压缩动态规划,就是我们俗称的状压DP,是利⽤计算机⼆进制的性质来描述状态的⼀种DP⽅式很多棋盘问题都运⽤到了状压,同时,状压也很经常和BFS及DP连⽤,例题⾥会给出介绍有了状态,DP就⽐较容易了举个例⼦:有⼀个⼤⼩为n*n的农⽥,我们可以在任意处种⽥,现在来描述⼀下某⼀⾏的某种状态:设n = 9;有⼆进制数 100011011(九位),每⼀位表⽰该农⽥是否被占⽤,1表⽰⽤了,0表⽰没⽤,这样⼀种状态就被我们表⽰出来了:见下表列数123456789⼆进制100011011是否⽤√×××√√×√√所以我们最多只需要 2n+1−1 的⼗进制数就好(左边那个数的⼆进制形式是n个1)现在我们有了表⽰状态的⽅法,但⼼⾥也会有些不安:上⾯⽤⼗进制表⽰⼆进制的数,枚举了全部的状态,DP起来复杂度岂不是很⼤?没错,状压其实是⼀种很暴⼒的算法,因为他需要遍历每个状态,所以将会出现2^n的情况数量,不过这并不代表这种⽅法不适⽤:⼀些题⽬可以依照题意,排除不合法的⽅案,使⼀⾏的总⽅案数⼤⼤减少从⽽减少枚举位运算有了状态,我们就需要对状态进⾏操作或访问可是问题来了:我们没法对⼀个⼗进制下的信息访问其内部存储的⼆进制信息,怎么办呢?别忘了,操作系统是⼆进制的,编译器中同样存在⼀种运算符:位运算能帮你解决这个问题(基础,这⾥不打算⾃⼰写了,参照,以下内容也复制⾃qxAi的这篇博客,这⾥谢谢博主)为了更好的理解状压dp,⾸先介绍位运算相关的知识。

1.’&’符号,x&y,会将两个⼗进制数在⼆进制下进⾏与运算,然后返回其⼗进制下的值。

例如3(11)&2(10)=2(10)。

2.’|’符号,x|y,会将两个⼗进制数在⼆进制下进⾏或运算,然后返回其⼗进制下的值。

例如3(11)|2(10)=3(11)。

3.’’符号,x y,会将两个⼗进制数在⼆进制下进⾏异或运算,然后返回其⼗进制下的值。

资料:动态规划状态压缩模型

资料:动态规划状态压缩模型

动态规划状态压缩模型有一些动态规划的状态并不是放与不放,取与不取,选与不选那么简单。

状态可能因为情况而变得很多,比如在一个n*m(n<=500,m<=10)的棋盘里面放棋子,有些格子被挖掉不能放棋子,并且任何两个棋子不得有上下左右的相邻,问最多放多少个棋,该怎么做呢?注意到m出奇的小,这就提示我们使用状态压缩模型来做。

先分析是否有后效性,发现任何一行在其下一行没有被放置的时候,都只受上一行的影响,于是满足了无后效性。

具体的做法是,把每一行的摆放情况看成一个二进制数,放了的地方是1,不放的地方是0,因此,每一种状态都可以用唯一一个数字来表示,于是就可以记录当前状态最多可以放多少个棋子了。

这里有一个优化,有些状态本身就是不合法的,如23(10111)在同行中就不满足,应该完全不考虑。

所以,先进行预处理把所有可能的状态求出来是很必要的。

第一行的每一个状态的棋子数等于本身这个状态所拥有的棋子数。

在状态转移中,第k 行的第s个状态可以为k-1行所有可能的状态数的和加上本身状态所拥有的棋子数,至于两状态是否冲突,可以使用位运算判断。

最后,选择第n行记录最大数字的状态就是答案。

本算法的时间复杂度为O(n*(2^m)^2),当m比较小时,此算法还是很快了。

由于状态压缩中使用的空间比较大,通常是指数级别的,所以推荐使用滚动数组来记录。

有一些状态压缩模型并不是描述前一行的状态就可以了这么简单,如:炮兵阵地(NOI2001)【题目描述】司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。

一个N*M的地图由N 行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示)。

在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队)。

一支炮兵部队能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。

炮兵的攻击范围不受地形的影响。

现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。

【最新推荐】状态压缩动态规划-范文模板 (13页)

【最新推荐】状态压缩动态规划-范文模板 (13页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==状态压缩动态规划篇一:一道状态压缩DP的详细思路一道状态压缩DP的详细思路河北省衡水中学高亚在动态规划的过程中,状态的表示有时候很是恶心,不容易表示出来,所以,我们需要用一些编码技术,将这些状态表示出来,最常用的方法是用一个二进制数来表示一个集合的状态,下面通过一道例题来对状态压缩DP进行分析小keke同学非常喜欢玩俄罗斯方块(**),他最近发现传统的俄罗斯方块很无趣,于是他想到了一个新规则的游戏来恶心你(……,没素质啊)。

游戏是这样的:给定你一个宽度为w的游戏场地,我们设高度为正无穷。

现在给你3种俄罗斯方块: 1*2的方块2*2的方块2*2的方块去掉一个1*1的方块如果你明白俄罗斯方块的规则的话,方块在下落过程中是可以随便旋转的。

而且是从上往下落,上面的落在下面的上面(废话!!!)现在给定你一个高度h,让你求出有多少种游戏的方法,使得最后恰好落满h 的高度(最上层是齐平的)。

因为这样可以得巨多分!巨!舒服~~~~~两个整数h,w含义如题所述一个整数,为能达到要求的游戏方法的总数。

1<=h,w<=9,注意答案有可能很大(你懂得,用不到高精度)首先,先根据题意,将这个俄罗斯方块的所有形状都画出来(注意这些方块已经标上号了,下面直接引用不加说明)观察到只有七种情况,并且它们的高度只有两行,所以,一个俄罗斯方块最多只会影响上一行或下一行,而不会影响其他行题目中给出的高度,宽度最多只有9,用二进制位完全可以满足要求,所以可以用0表示这个地方是空的,1表示这个地方已经被填充了木块,那么可以很方便的用两个十进制数来表示两行的状态设f[i][j]表示前i行,并且第i行状态为j的最多方案数,那么因为第i行的放置方案仅仅只会影响上一行,所以可以得以下方程:f[i][j]=∑f[i?1][j′]其中,要求第i-1行的j'状态能够推到j这个状态来个最简单的例子,一个2*2的方格,从空的状态到把它填满,方案数是多少?(其实就是样例)可以看到,如果用刚才的方法,直接用0表示不填,用1表示填,那么这三种方案的状态表示是一样的,所以如果只是简单的求和,方案数就只是简单的1,并不是我们想要的结果,如何满足这一点的要求呢?其实可以采用预处理的方法,预处理出从状态i到状态j的方案数有多少种,记录到g[i][j]数组中(如果不能转移到,那么g[i][j] = 0),然后在方程转移的时候,直接采用下面的方程:f[i][j]=∑g[j′][j]?f[i?1][j′]其中j'还是老规矩,能从j'状态推到j这个状态因为有了g[j'][j]这个从j'状态推到j状态的方案数,所以在i-1行状态为j'时,想推到第i行状态为j,共有g[j'][j]种方案可以选择,根据乘法原理,所以f[i-1][j']的方案数乘以g[j'][j]就可以得到f[i][j],最后针对每种状态,求和即可好了,我主要想说的是如何进行预处理,最后还想说说方程中f数组的初值问题,因为这两个问题是我都犯过错的,或许能引以为戒预处理的目的是求出任何一个状态i到任何一个状态j的方案数一共有多少,那么显然,i和j都不大,搜索即可需要注意的是,搜索中有许多细节问题需要处理,相当考验细心搜索的时候,我们枚举的是状态i,然后搜索状态i能够推出什么样的状态j,针对推出的每一种合法的i, j,将相应的g[i][j]加1枚举状态i就不用多说了,一个for循环就可以了,注意区间是[0, 2w) (左闭右开)当有了状态i,那么我们的目标是将状态i填满(变成11111111这种形式),并且记录得到的相应的状态j,这个步骤的伪代码如下:基本上就是这些,注意边界的处理就好了第一次打这个搜索的时候,没有弄清搜索的实质是要干什么,导致position的加减总是不对,并且,状态考虑重复,造成了答案偏大基本的递推就是三重for循环,这个没什么问题,主要是那个f数组的初值问题这里必须且只能赋f[ 1][ 0] = 1,为什么?首先,f[ 1][ 0] = 1的含义是第一行什么都不填的方案数是1,这个应该没什么问题,但为什么不将f[ 1][j]的其它状态的初值赋上?还是先考虑一下赋初始值的目的,显然是将f[ 2][j]全部计算出来,对于任意的一个j,会枚举出所有的第一行的状态,并将它们全部累加,但其实第一行的任何合法状态都只能是一种方案,只将f[ 1][ 0]赋值就可以保证不会重复计算,如果其它的f[ 1][j]也有值的话,就会重复累加很多方案数,但其实并没有这么多综上所述,这里必须且只能赋f[ 1][ 0] = 1代码还可以吧,配合着上面的伪代码解析,应该挺容易懂的篇二:动态规划_状态转移方程-我们将人生划为诡异的阶段·我们把这个世界表为丰富的状态1. 资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k])2. 资源问题2 ------01背包问题 F[I,j]:=max(f[i-1,j-v[i]]+w[i],f[i-1,j]); 3. 线性动态规划1-----朴素最长非降子序列 F[i]:=max{f[j]+1}4. 剖分问题1-----石子合并 F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]);5. 剖分问题2 -----多边形剖分 F[I,j]:=min(f[i,k]+f[k,j]+a[k]*a[j]*a[i]);6. 剖分问题3 ------乘积最大 f[i,j]:=max(f[k,j-1]*mult[k,i]);7. 资源问题3 -----系统可靠性(完全背包) F[i,j]:=max{f[i-1,j-c[i]*k]*P[I,x]} 8. 贪心的动态规划1-----快餐问题F[i,j,k]:=max{f[i-1,j',k']+(T[i]-(j-j')*p1-(k-k')*p2) div p3} 9. 贪心的动态规划2 -----过河f[i]=min{{f(i-k)} (not stone[i]){f(i-k)}+1} (stone[i]); +贪心压缩状态10. 剖分问题4-----多边形-讨论的动态规划F[i,j]:=max{正正 f[I,k]*f[k+1,j]; 负负 g[I,k]*f[k+1,j]; 正负g[I,k]*f[k+1,j];负正 f[I,k]*g[k+1,j];} g为min 11. 树型动态规划1 -----加分二叉树 (从两侧到根结点模型) F[I,j]:=max{f[I,k-1]*f[k+1,j]+c[k]} 12. 树型动态规划2-----选课 (多叉树转二叉树,自顶向下模型)F[I,j]表示以i为根节点选j门功课得到的最大学分f[i,j]:=max{f[t[i].l,k]+f[t[i].r,j-k-1]+c[i]}13. 计数问题1 -----砝码称重 f[f[0]+1]=f[j]+k*w[j]; (1<=i<=n;1<=j<=f[0]; 1<=k<=a[i];) 14. 递推天地1 ------核电站问题f[-1]:=1;f[0]:=1; f[i]:=2*f[i-1]-f[i-1-m] 15. 递推天地2 ------数的划分f[i,j]:=f[i-j,j]+f[i-1,j-1]; 16. 最大子矩阵1 -----一最大01子矩阵f[i,j]:=min(f[i-1,j],v[i,j-1],v[i-1,j-1])+1; ans:=maxvalue(f); 17. 判定性问题1 -----能否被4整除g[1,0]:=true; g[1,1]:=false;g[1,2]:=false; g[1,3]:=false; g[i,j]:=g[i-1,k] and ((k+a[i,p]) mod 4 = j) 18. 判定性问题2 -----能否被k整除f[I,j±n[i] mod k]:=f[i-1,j];-k<=j<=k; 1<=i<=n20. 线型动态规划2-----方块消除游戏f[i,i-1,0]:=0 f[i,j,k]:=max{f[i,j-1,0]+sqr(len(j)+k),f[i,p,k+len[j]]+f[p+1,j-1,0]}ans:=f[1,m,0] 21. 线型动态规划3 -----最长公共子串,LCS问题 f[i,j]={0 (i=0)&(j=0); (i>0,j>0,x[i]=y[j]); f[i-1,j-1]+1 max{f[i,j-1]+f[i-1,j]}} (i>0,j>0,x[i]<>y[j]); 22. 最大子矩阵2-----最大带权01子矩阵O(n^2*m)。

基于动态规划的图像压缩问题

基于动态规划的图像压缩问题

if(s[i]>s[i-j]+j*bmax) { s[i] = s[i-j] + j*bmax; l[i] = j; } } s[i] += header; } } int length(int i) { int k=1; i = i/2; while(i>0) { k++; i=i/2; } return k; }




b代表bits,l代表length,分段是,b[i]表示每段一个 像素点需要的最少存储空间(少于8位才有意义),l[i] 表示每段里面有多少个像素点,s[i]表示从0到i压 缩为一共占多少存储空间。 如果限制l[i] ≤255,则需要8位来表示l[i]。而b[i] ≤8,需要3位表示b[i]。所以每段所需的存储空间 为l[i]*b[i]+11位。 假设将原图像分成m段,那么需要 位的存储空间。
bmax(i, j ) log max { p } 1 k i k j

数组l[i],b[i]记录了最优分段所需的信息最优分 段的最后一段的段长度和像素位数分别存储在l[n] 和b[n]中,其前一段的段长度和像素位数存储于l[nl[n]]和b[n-l[n]]中,依此类推,可在O(n)时间内构 造最优解。
设s[i],1≤i≤n是像素序列{p1,p1,……pi}的 最优分段所需的存储位数,则s[i]为前i-k个的 存储位数加上后k个的存储空间。由最优子结 构性质可得:
s[i ]
式中
1 k min{i , 256}
min
{s[i k ] k * b max( i k 1, i)} 11
11111maxmaxbbminminmin?iss??????iikkiikkkkiiss12561????iik????????????????1maxkilogbmaxkjpji式中?数组libi记录了最优分段所需的信息最优分段的最后一段的段长度和像素位数分别存储在ln和bn中其前一段的段长度和像素位数存储于lnln和bnln中依此类推可在on时间内构造最优解

状态压缩动态规划学习笔记

状态压缩动态规划学习笔记

状态压缩动态规划学习笔记状态压缩动态规划学习笔记算法介绍状态压缩动态规划是近些年来NOIP提⾼组常考的算法,也是⽇后ACM必备的算法之⼀,因此我们有必须要学习此类⾼级算法.⽽且此类算法往往是NP算法的最强优化之⼀.算法思想状态压缩动态规划,顾名思义也就是,将动态规划中的状态数组进⾏了压缩.那么想到压缩,我们不免就要想到⼀种常⽤的时间空间优化技巧,或者说⼀种特殊的算法,也就是位运算.卡常算法就是它,⾼端暴⼒就是它,奇迹算法还是它.位运算,也就是⼆进制的运算,⽽且我们的⼆进制,是⼀种计算机中最为核⼼的编码,这也就是为什么,电脑对于这种编码运算速度最快.状态压缩动态规划,就是利⽤了位运算,的这三⼤优化性质,来起到简化代码,优化代码,解决难题的⽬的.位运算基础&|^<<>>中⽂意思并或异或右移左移举例说明1&1=11|0=11^0=11<<1=1010>>1=11&0=00|0=01^1=011<<1=110101>>1=10判断算法⾸先拿到⼀道题⽬,我们第⼀步就是要看数据范围,题⽬描述. ⽽且当你发现数据范围和题⽬描述具有以下三⼤特点的时候,那么我们就可以初步判断这道题⽬需要使⽤状态压缩动态规划.1. 数据中的N,M范围很⼩,基本上不超过30,20.(N,M⼴义理解)2. 题⽬似乎要我们求⽅案数,或者说极值问题.3. 题⽬似乎是个棋盘覆盖这种类型的问题.算法处理⼀般来说,状态压缩动态规划算法,最为困难,也是最为关键的⼀步,就在于状态如何以⼆进制表⽰那么接下来我就来详细解说,状态压缩的状态到底如何设置.⼀般来说状态设置,往往是⼀个整数,表⽰⼀个⼆进制决策集合.⽐如说13,它就可以表⽰为1011,那么我们⼀般来说可以表⽰第⼀个点,第⼆点,第四个点已经选择这个意思.因为我们可以确定算法为状态压缩,那么我们现在的主⼒攻击,就是状态设置,既然现在我们已经有了这个⽬标,显然我们就是尽量地将题⽬的条件进⾏转化,在这⾥我们具体以棋盘类型来分析.对于条件⽽⾔的话,我们需要捕捉到关键点.1. 如果说题⽬中出现了这⼀个点不可以选择,那么你的神经中枢第⼀时间就要条件反射地,对⾃⼰的内⼼说⼀句,这⾥是1.这⾥是1到底是什么意思?其实这个意思,就是告诉我们这个点不可以选择,我们可以通过开⼀个特殊数组来保存,那么到了以后,对于我们枚举的⼀个决策集合,那么我们可以通过&运算,来判断这个点是否可以选择.⽐如说我们现在要求第五个点不可以选择,那么我们可以构造⼀个判断数组.10000表⽰第五个点不可以选择.那么假如说我们当前枚举的状态决策集合是11000,这个意思是,我们当前选择第四个点和第五个点.那么我们可以通过&运算,来进⾏判断.11000的⼗进制表⽰为24,⽽我们10000表⽰为16.那么我们进⾏&运算.24&16 ==> 11000 & 10000 ==> 16 ==> 10000总结:所以说我们可以通过&运算,进⾏判断是否选择.同理,如果题⽬说必须选择,显然&运算也可以发挥作⽤.其他运算操作以后再慢慢补充吧,我们先来⼏道题⽬感受感受.题⽬选讲第⼀题题⽬描述求把N×M的棋盘分割成若⼲个1×2的的长⽅形,有多少种⽅案。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

46ms
31ms
m = n = 12 无障碍
873ms
499ms
265ms
140ms
建议使用2k进制,位运算效率高
拓展
• 如果求经过所有非障碍格子的哈密顿 路径的个数呢?
独立插头
3进制→4进制
• 0 → 无插头状态
• 1 → 左括号插头
• 2 → 右括号插头
• 3 → 独立插头
广义的括号匹配
•• 如括果号一表个示连法通需块要只满有足1一个个插头或大于2个插头呢?
生成树计数 (NOI2007)
• 一类最优性问题的剪枝优化
Rocket Mania (Zju2125)
Thank you for listening!
Questions are welcome.
• 对于m = n = 12的无障碍棋盘的极限数据, 扩展 状态总数为1333113 , 问题已经基本解决.
• 本题为一个棋盘模型的简单回路问题. 针对问题的特殊性, 是否有更好的方法呢?
进一步分析
• 每个非障碍格子恰好有2个插头 •• 轮从廓左线到以右上一由定若不干会条出互现不4个相插交头的a路, b径, c构, d成, • 每a, 条c匹路配径,的b两, d端匹对配应.两个插头
)插头
无插头 ( ( ) # ) (( )#)
) 插头
转移时间:O(1)
实验比较
测试数据 最小表示 最小表示 括号表示 括号表示
7Based 8Based 3Based 4Based
m = n = 10 31ms
15ms
0ms
0ms
无障碍
m = n = 11 187ms (1,1)为障碍
109ms
总结
广 义 的 括 号 表 示 法
最小表示法
简单回路
拓 展
括号表示法
3进制→4进制 简单路径
括号表示法的改进
全文研究内容
• 一类简单路径问题
Formula 1(Ural1519) Formula 2(改编自Formula 1)
• 一类棋盘染色问题
Black & White(Uva10532)
• 一类基于非棋盘模型的问题
转移时间: O(1)
Case 2
有上插头和左插头
Case 2.2 左插头为)插头,上插头为(插头
( 插头
)插头
(#) ( )
( ### )
转移时间:O(1)
Case 2
有上插头和左插头 Case 2.3 左插头为(插头,上插头为)插头
( 插头
)插头
路径的两端连接 起来形成回路
Case 3
上插头和左插头恰好有一个,这种情况相当 于延续原来的连通分量
• 一个 m * n 的棋盘 • 有的格子存在障碍 • 求经过所有非障碍格子的哈密顿回路个数
初步分析
• 问题特点:
• 数据规模小 m, n≤12

棋盘模型
划分阶搜段索:从?上到下O,((从mn左)!到) 右逐格递推
√ 基本状概态念:压插头缩,!轮廓线
基本概念
• 插头 • 一轮个廓格线子某个方向的插头存在
插头不(会)交( 叉( ) ) ( )
插头两两匹配
括号序列a! b c d
括号表示法
3进制
0:无插头状态,用 # 表示 1:左括号插头,用 ( 表示 2:右括号插头,用 ) 表示
( ( ) #)( )
(1 1 2 0 2 1 2)3
状态的转移
• 每次转移相当于轮廓线上当前决策格子的左插 头改成下插头,上插头改成右插头的状态.
基于连通性状态压缩的 动态规划问题
长沙市雅礼中学 陈丹琦
Email : skyfish_cdq@
引入
• 我的状论态文针压对缩其中动的态一类规问划题进行探讨和 研究—— 状态中需要记录若干个元素之间 的连通情以况集,合称信为基息为于状连态通性状态压 缩的动态状态规总划数问为题指数级
【例】Formula 1 (Ural1519)
• 对连于通最一块左个内边大恰的于好插2有个头2插标个头记插的为头连(.通块
最右边的插头标记为 ) 中间的插头标记为 )( • 单独为一个连通块的插头标记为 ( )
广义的括号表示法
广义的括号表示法
• 左括号与右括号匹配对应的插头连通 • 例: 最小表示法 → 广义括号表示法
12234321
( ( )( ( () ) ) )
表示这个格子在这个方向与相 已决策格子和未决策格 邻 子格 的子 分相 界连线. 轮廓线上方与其相连的 有n+1个插头,包括n个 下插头和1个右插头.
初步分析
• 问题特点: • 数据规模小 • 棋盘模型
每个插头是否存在
• 所有的非障碍格子连通
插头之间的连通性!
确立状态
• 设 f (i, j, S) 表示转移完(i, j) ,轮廓线上从左到
• 右无n插+1头个标插记头0是,否有存插在头以标及记它一们个的正连整通数性为S • 的连方通案的总插数头.标记相同的数字
• 从左到右依次标记
• 如何表示S?
• 最小表示法
12 2 01
f (3,2,{1,2,2,0,1})
状态转移
• 考虑每个格子的状态, 根据上一个状态O(n)扫 描计算出新的最小表示状态.
Case 1
没有上插头和左插头,有下插头和右插头, 相当于构成一个新的连通块.
( ### )
( 插头
(( )#) ) 插头
转移时间:O(1)
Case 2
有上插头和左插头,这种情况下相当于合并 两个连通分量
Case 2.1 上插头和左插头均为(插头 #( ())
(插头
(
插头 ( 插头
(
#
#
(
)
ቤተ መጻሕፍቲ ባይዱ
预处理每个状态每的 括号所匹配的括号
相关文档
最新文档