动态规划步骤.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态规划步骤

  动态规划的主要难点在于理论上的设计,一旦设计完成,实现部分就会非常简单。   根据动态规划的基本方程可以直接递归计算最优值,但是一般将其改为递推计算,实现的大体上的框架如下: 标准动态规划的基本框架 1. 对fn+1(xn+1)初始化; {边界条件} 2. for k:=n downto 1 do 3. for 每一个xk∈Xk do 4. for 每一个uk∈Uk(xk) do begin 5. fk(xk):=一个极值; {∞或-∞} 6. xk+1:=Tk(xk,uk); {状态转移方程} 7. t:=φ(fk+1(xk+1),vk(xk,uk)); {基本方程(9)式} 8. if t 比fk(xk)更优 then fk(xk):=t; {计算fk(xk)的最优值} end; 9. t:=一个极值; {∞或-∞} 10. for 每一个x1∈X1 do 11. if f1(x1)比t 更优 then t:=f1(x1); {按照10 式求出最优指标} 12. 输出t; 但是,实际应用当中经常不显式地按照上面步骤设计动态规划,而是按以下几个 步骤进行: 1. 分析最优解的性质,并刻划其结构特征。 2. 递归地定义最优值。 3. 以自底向上的方式或自顶向下的记忆化方法(备忘录法)计算出最优值。 4. 根据计算最优值时得到的信息,构造一个最优解。 步骤(1)--(3)是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤(4) 可以省略,若需要求出问题的一个最优解,则必须执行步骤(4)。此时,在步骤 (3)中计算最优值时,通常需记录更多的信息,以便在步骤(4)中,根据所记录的 信息,快速地构造出一个最优解。 出列人数最少,也就是说留的人最多,也就是序列最长。 这样分析就是典型的最长下降子序列问题。只要枚举每一个人站中间时可以的到的最优解。显然它就等于,包括他在内向左求最长上升子序列,向右求最长下降子序列。 我们看一下复杂度: 计算最长下降子序列的复杂度是O(N2),一共求N次,总复杂度是O(N3)。这样的复杂度对于这个题的数据范围来说是可以AC的。但有没有更好的方法呢? 其实最长子序列只要一次就可以了。因为最长下降(上升)子序列不受中间人的影响。 只要用OPT1求一次最长上升子序列,OPT2求一次最长下降子序列。这样答案就是N-max(opt1[i]+opt2[i]-1). 复杂度由O(N3)降到了O(N2)。 【问题描述】 PALMIA国家被一条河流分成南北两岸,南北两岸上各有N个村庄。北岸的每一个村庄有一个唯一的朋友在南岸,且他们的朋友村庄彼此不同。 每一对朋友村庄想要一条船来连接他们,他们向政府提出申请以获得批准。由于河面上常常有雾,政府决定禁止船只航线相交(如果相交,则很可能导致碰船)。 你的任务是编写一个程序,帮助政府官员决定批准哪些船只航线,使得不相交的航线数目最大。 【输入文件】ships.in 输入文件由几组数据组成。每组数据的第一行有2个整数X,Y,中间有一个空格隔开,X代表PALMIA河的长度(10=X=6000),Y代表河的宽度(10=Y=100)。第二行包含整数N,表示分别坐落在南北两岸上的村庄的数目(1=N=5000)。在接下来的N行中,每一行有两个非负整数C,D,由一个空格隔开,分别表示这一对朋友村庄沿河岸与PALMIA河最西边界的距离(C代表北岸的村庄,D代表南岸的村庄),不存在同岸又同位置的村庄。最后一组数据的下面仅有一行,是两个0,也被一空格隔开。 【输出文件】ships.out 对输入文件的每一组数据,输出文件应在连续的行中表示出最大可能满足上述条件的航线的数目。 【输入样例】 30 4 7 22 4 2 6 10 3 15 12 9 8 17 17 4 2 0 0 【输出样例】 4 【问题分析】 这道题目相对来说思考难度较高,从字面意义上看不出问题的本质来,有点无法下手的感觉。寻找规律自然要推几组数据,首先当然有从样例入手; 仔细观察上图:红色航线是合法的,那么他们满足什么规律呢?         C1??? C2??  C3? ? C4 北岸红线的端点: 4????  9???  15??  17 南岸红线的端点: 2?? ?? 8???  12??  17         D1??? D2 ?? D3??  D4 不难看出无论线的斜率如何,都有这样的规律: C1C2C3C4 且? D1D2D3D4 如果我们把输入数据排升序,问题变抽象为: 在一个序列(D)里找到最长的序列满足DIDJDk……且ijk 这样的话便是典型的最长非降子序列问题了。。。。 法二:边界条件法 边界法其实就是把数据往小了缩,显然N=1是答案是1。N=2时呢? 考虑这样一组数据

文档评论(0)

st4739288 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档