动态规划的几种典型模型

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

• 当搜到x>m时,则再次计算状态值,更新 f[i+1][k] • 我们注意到,f[i+1][]只与f[i][]有关,所以将f 设为滚动数组即可
• 下面看一下代码
树状模型
• 没有上司的舞会 • 贪吃的九头龙
贪吃的九头龙
• http://acm.sjtu.edu.cn/OnlineJudge/problem/ 1079
动态规划的几种典型模型
线性模型
• 最容易导致动态规划算法
• 可以递归或者每次增加一个元素,逐步扩 大考虑范围 • 典型例题:背包问题
区间模型
• 记忆化搜索 • 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) • 这样就实现了状态压缩和解压
• 边界:f[0][0][1]=f[0][0][0]=0 • f[0][k][1]=f[0][k][0]=0x3f3f3f3f
• 所求结果:f(1.son,k-1,1)
来自百度文库
• 下面看一下代码
• 那么我们只考虑大头。用f[i][j][k]表示以i为 根的子树有j个果子分给大头的最小难受值, k=0表示点i小头吃,k=1表示点i大头吃 • 但每个i有多个儿子需要考虑,这样我们需 要在这个线型结构中再次使用动态规划, 也就是枚举每一个子节点分配几个果子, 比较麻烦。所以我们又有了第二种思路, 即把这棵树转成二叉树,再使用动态规划。 • 转二叉树时,将i的第一个子节点作为左节 点,i的第一个兄弟节点作为右节点即可(具
• 接下来枚举每一行,每一行枚举上一行的 状态,然后进行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)
• 首先明确是树上的动态规划
• 现在先判断有没有解,如果果子不够吃即 n<k+m-1,则输出-1,反之一定有解 • 现在从m分为两类
– m=2 对于每一段树枝,如果两边的果子都是 大头吃或小头吃,则这段树枝就要吃掉 – m>=3,小偷至少有两个,确定大头吃的果子了 后,剩下的果子按高度奇偶性分类,则让一个 吃奇数,一个吃偶数,一定小头不会吃树枝
体待会儿见代码)
• 转了二叉树后我们的状态需要进行一下调 整,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=1&&j=1), d(i,j)=1(i=0&&j=0&&m=2),else d(i,j)=0
相关文档
最新文档