《小谈动规》课件.pptVIP

  • 9
  • 0
  • 约6.7千字
  • 约 45页
  • 2018-11-28 发布于广西
  • 举报
09级 王 浩 状态 阶段 决策 状态就是你用f[i,j]之类的形式,把你想要求的东西概括进去 其中i,j可以是得到答案时的条件,f[i,j]是最后的答案;还可以用i,j表示答案,f[i,j]表示条件 但是无论形式如何,我们最终追求的是 例 理想收入问题 你有一元钱,求你在股票交易中的最大收益; 就是说你可以买卖股票,其中每天每股邮票价格给出,设第i天为V[i];共N天 如何表示状态? 例 理想收入问题 方法一 F[i]表示在第i天收盘时能达到的最高收入 F[i]=max{F[j]/V[k]*V[i]} (1=j=ki) 意思就是 你第i天想要获得最大值,手里得有股票,不妨设是第k天买来的,前提是第k天有钱,不妨设是第j天卖出挣的; 这样表示,需要枚举i,j,k;时间复杂度o(N^3) 例 理想收入问题 方法二 设P[i]为前i天最多获得股票数 P[i]=max{P[i-1],P[j]*V[j]/V[i]} (1=j=i-1) 也就是说第i天买股票,用的是第j天卖股票的钱 需要枚举i,j 时间复杂度o(N^2),好了一些 例 理想收入问题 方法三 用Q[i]表示前i天的最大收益 Q[i]=max{Q[i-1],Q[j]/V[j]*V[i]}(1=j=i-1) 与前面类似,但要注意“前”,而不是“第” 因此方程中加入Q[i-1],前i天包括前i-1天的最优解 仍然要枚举i,j;貌似o(N^2) for i:=1 to n do begin Q[i]:=Q[i-1]; for j:=1 to i-1 do if Q[i]Q[j]/V[j]*V[i] then Q[i]:=Q[j]/V[j]*V[i]; end; 例 理想收入问题 方法三 for i:=1 to n do begin Q[i]:=Q[i-1]; for j:=1 to i-1 do if Q[i]Q[j]/V[j]*V[i] then Q[i]:=Q[j]/V[j]*V[i]; end; 注意到Q[i]是用i之前最大Q[j]/V[j]乘上V[i]来更新;只要用BIGQ保存max{Q[j]/v[j]}即可,于是o(N)…… For i:=1 to n do begin Q[i]:=BIGQ*V[i]; if Q[i-1]Q[i] then Q[i]:=Q[i-1]; if BIGQQ[i]/V[i] then BIGQ:=Q[i]/V[i]; end; 所谓阶段 阶段就是一步一步不能乱 例 财富的时空穿梭 用F[i,j]表示第i天第j小时获得的最大财富值 F[i,j]=max{F[i-1,k]+V[i,j]}(1=k=M) 就是说第i天只能由第i-1天推来…… 简单到无法忍受!数字三角形的变形! 你有特异功能,你能捡到天上掉的馅饼!前提是馅饼不是太大而砸不死人……第i天第j小时掉一个价值为V[i,j]的馅饼,赚了!你可以通过时空穿梭把馅饼传递给后一天的 某一小时,找到一种传递方法使最后一天某一小时得到最大财富。共N天每天M小时。 从中可以看出,每一天为一个阶段,当前只与上一天有关, 一天的各小时互不干扰,这就叫阶段。 所谓决策 决策就是现在该干什么,不去考虑过去,不去畅想未来,把当前的每种选择都考虑到分情况讨论。 例1 01背包问题 N个物品,第i个重量为W[i],价值为V[i],用一个承重为T的背包来装,求最大价值。 大家都会,直接写代码: For i:=1 to N do for j:=1 to T do begin if F[i,j]F[i-1,j] then F[I,j]:=F[i-1,j]; if F[i,j]F[i-1,j-W[i]]+V[i] then F[i,j]:=F[i-1,j-W[i]]+V[i]; end; 里面有两个if语句,这就是两种决策,选择其中最优的一个 例2 数字三角形 1 1 2 5 4 3 7 6 5 8 2 1 3 1 2 从顶点到最下一行 找一条路使和最大 每个位置只能向下或右下走 F[i,j]表示第i行第j个位置得到

文档评论(0)

1亿VIP精品文档

相关文档