- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态规划几种典型模型
动态规划的几种典型模型 线性模型 最容易导致动态规划算法 可以递归或者每次增加一个元素,逐步扩大考虑范围 典型例题:背包问题 区间模型 记忆化搜索 j-i递增的顺序枚举 典型例题:合并傻子 状态压缩模型 Poj1038 Bugs 公司 首先,我们发现m=10,而且第i行只与第i-1行和i-2行有关,所以可以用三进制表示状态,每一行的状态分为0,1,2三种,于是一行的状态就可以用一个三进制数表示。 设2表示此格已被占据,1表示此格的上一格被占据,0表示此格的上一个和此格均未被占据。 设Pi为上一行放置序列第i个数,Qi为本行的,那么Qi=2(本格被占据),Qi=Pi-1(Pi!=0),Qi=0(Pi=0) 这样就实现了状态压缩和解压 接下来枚举每一行,每一行枚举上一行的状态,然后进行dfs深搜 设f[i][j]表示第i行放置序列为j的最大放置数,在不放置任何新芯片的情况下f[i+1][k]=f[i][j] 深搜时有以下几种决策: 方格(i+1,x)不放芯片,那么搜索下一格 方格(i+1,x)(i+1,x+1)(i+1,x+2)三进位数均为0,可以搜(i+1,x+3) 方格(i+1,x)(i+1,x+1)(i,x)(i,x+1)为0,可以往下搜(i+1,x+2) 当搜到xm时,则再次计算状态值,更新f[i+1][k] 我们注意到,f[i+1][]只与f[i][]有关,所以将f设为滚动数组即可 下面看一下代码 树状模型 没有上司的舞会 贪吃的九头龙 贪吃的九头龙 /OnlineJudge/problem/1079 首先明确是树上的动态规划 现在先判断有没有解,如果果子不够吃即nk+m-1,则输出-1,反之一定有解 现在从m分为两类 m=2 对于每一段树枝,如果两边的果子都是大头吃或小头吃,则这段树枝就要吃掉 m=3,小偷至少有两个,确定大头吃的果子了后,剩下的果子按高度奇偶性分类,则让一个吃奇数,一个吃偶数,一定小头不会吃树枝 那么我们只考虑大头。用f[i][j][k]表示以i为根的子树有j个果子分给大头的最小难受值,k=0表示点i小头吃,k=1表示点i大头吃 但每个i有多个儿子需要考虑,这样我们需要在这个线型结构中再次使用动态规划,也就是枚举每一个子节点分配几个果子,比较麻烦。所以我们又有了第二种思路,即把这棵树转成二叉树,再使用动态规划。 转二叉树时,将i的第一个子节点作为左节点,i的第一个兄弟节点作为右节点即可(具体待会儿见代码) 转了二叉树后我们的状态需要进行一下调整,f[i][j][k]b表示以i为根的子树及兄弟节点的子树……中j个果子大头吃的最小难受值,k=0表示i的父节点小头吃,1是大头吃,设fa[i]表示i在原树中的父节点 则状态转移方程为 f(i,j,k)= min{f(son,j’,1)+f(brother,j-j’-1,k)+d(k,1)*cost[i,fa[i]], f(son,j’,0)+f(brother,j-j’,k)+d(k,0)*cost[i,fa[i]]} 其中d(i,j)=1(i=1j=1), d(i,j)=1(i=0j=0m=2),else d(i,j)=0 边界:f[0][0][1]=f[0][0][0]=0 f[0][k][1]=f[0][k][0]=0x3f3f3f3f 所求结果:f(1.son,k-1,1) 下面看一下代码
原创力文档


文档评论(0)