动态规划状态转移方程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
首先是两两相乘
For i:=1 to n-1 do
F[i,i+1]:=a[i].x*a[i].y*a[i+1].y;
然后是更大规模的连乘
For len:=3 to n do
For i:=1 to n-len+1 do Begin j:=i+len-1;F[i,j]:=maxlongint; For k:=i to j-1 do If F[i,j]>F[i,k]+F[k+1,j]+a[i].x*a[k].y*a[j].y Then Begin F[i,j]:=F[i,k]+F[k+1,j]+a[i].x*a[k].y*a[j].y; End; End ;
begin
f[I,j]:=f[i-1,j]; if (w[i]<=w) and (f[I,j]<f[i-1,j-w[i]]+p[i]) then
f[I,j]:=f[i-1,j-w[i]]+p[i]; end; write(f[n,w]);
joy的工具箱
Joy是一位非常出色的汽车维修工,而且他的创业能力也很强,这不,
输入和输出
joy.in 23 5 11 20 9 19 10 15 7 14 8 15 joy.out 39
关键要素分析
1、阶段 2、状态 3、决策
分析状态转移方程
F[I,j]表示前i个工具选择部分装入占用容量
为j的工具箱中的最大效率分:
f[i,j]:=max{f[i-1,j-v1[i]]+p[i] |}
部分背包问题算法
为了让每份背包单位体积价值最大,只要
对所有物品按照性价比从大到小排序,依 次装入物品即可,直到背包满或者没有物 品可取
01背包问题
N个物品每个有价值a[i]和体积v[i],但每
个物品不能分割(要么全部取,要么不 取),求最大的背包所含的价值。
01背包问题
1、如果不管哪个物品装入,都能恰好装
经典问题:矩阵连乘
有n个矩阵,计算他们连乘的最少乘法次
数。 输入第一行为一个整数n,表示参加连乘 的矩阵的个数,下面n行,依次给出各个 矩阵的行数和列数规模。 输出最少的乘法次数(连乘目标是只有一 个矩阵)。
输入和输出
输入: 3 1 5 5 20 20 1
输出:
105
核心程序段
fillchar(f,sizeof(f),0); for i:=1 to n do for j:=1 to v do begin f[i,j]:=f[i-1,j]; if (v1[i]<=j) and (f[i,j]<f[i-1,j-v1[i]]+p[i]) then f[i,j]:=f[i-1,j-v1[i]]+p[i]; end; write(f[n,v]);
初步的程序结构
For i:=1 to n do for j:=1 to w do begin
f[I,j]:=f[i-1,j]; {不取当前物品i} for k:=1 to j/v[i] do if (j>=k*v[i]) and (f[I,j]<=f[I,j-v[i]]+a[i]) then f[I,j]:=f[I,j-v[i]]+a[i]; end; end;
另一种形式的程序
For i:=1 to n do for j:=1 to v[i]-1 do f[I,j]:=f[i-1,j]; for j:=v[i] to w do if f[i-1,j]>f[I,j-v[i]]+a[i] then
f[I,j]:=f[i-1,j] else f[I,j]:=f[I,j-v[i]]+a[i];
满背包,那么问题就是“背包单位体积所 含价值最大” 2、可能出现的情况是某些性价比较高的 物品装入后导致其他性价比较低物品不能 装入,导致背包体积被浪费。所以不能再 用贪心了 3、只能用DP解决
01背包问题
枚举阶段(所有物品)
For i:=1 to n do for j:=0 to w do begin f[I,j]:=f[i-1,j];
最近他成立了自己的汽车维修110公司,一旦汽车在半途抛锚,只要 一个电话,joy就会立刻带着他的工具箱赶到事故地点,为驾驶员朋 友维修汽车,由于抢修及时以及维修技术高,汽车维修110公司的生 意越来越红火。 但joy是一个追求无止境的人,在生意越做越大的同时,他又动开 了新脑筋。他发现无论维修工具箱买得如何大,肯定不能把他公司 里所有的维修工具装进去,100%的故障排除率不仅需要精湛的维修 技术,如何选择并把最为合适的维修工具装入工具箱,并把工具箱 带到故障现场,也是一个非常重要的技巧。由于工具众多,joy无法 根据驾驶员报告的故障现象确定最为合适的一些工具,作为朋友的 你决定通过程序来帮助joy选择最为合适的工具转入到工具箱中。
加。
状态转移分析
1、用a[i]表示第i堆石子的数量 2、f[I,j]表示第i堆到第j堆合并为一堆的最
小分数 3、f[I,j]=min{f[I,k]+f[k+1,j]+sigma(a[t] | i<=t<=j) | i<=k<j} 4、初始化时必须是:f[I,i]:= maxint;f[I,i]:=0
当然,joy会事先告诉你一些必要的信息。
比如,他的每个工具都是不同的,工具箱 的总体积,joy还会告诉你他根据故障特 点给每个工具合适程度的效率分数,你的 程序必须能确定哪些工具被装入工具箱, 并输出总的最大效率分。
输入文件joy.in第一行包含二个整数v和n,
分别表示工具箱总体积和所有可供选择的 工具的数量。下面共有n行,每行有二个 用空格分隔的整数,依次分别表示每个工 具的体积大小和joy给定的效率分。 输出文件joy.out包含一个整数,表示在 工具箱有限的空间内,所装入的所有工具 的效率分数的最大值。
彩石运输
阿强是一个汽车运输工,他正在给一项装饰工程运输所需
的彩色石头。这些石头的颜色各异,价格也各不相同。有 一天阿强突发奇想,他想在一堆彩石中有选择地把彩石装 上他的卡车,使得卡车上装载的石头总价值是所有装载方 案中最大的。现在有一堆彩石堆放在阿强面前,他知道任 何两块石头的颜色都是不同的,但两块颜色不同的石头的 重量和价格可能相同。 阿强的卡车总共可装载的重量是W,而且他知道总的彩 石的块数,请你帮助阿强确定一个方案,满足阿强的奇想。 输入文件stone.in的第一行是二个整数,依次表示卡车 的载重量W和总的彩石块数n,下面共有n行,每行包含二 个用空格分隔的整数,依次表示某种颜色彩石的重量和价 值。 输出文件stone.out只包含一行一个整数,表示卡车最终 装载彩石的最大总价值。
for j:=v[i] to w do
begin
if f[i-1,j-v[i]]+a[i]>f[I,j] then f[I,j]:= f[i-1,j-v[i]]+a[i]>f[I,j] end; End;
完善程序
1、初始化? Fillchar(f,sizeof(F),0) 2、最终解在哪里? F[n,w]中。因为每个阶段的f[I,j]表示的是
输入输出
stone.in 30 5 20 50 10 30 15 44 5 14 4 13 stone.out 88
问题分析
1、有些选手会陷入二种错误的贪心算法
中 2、为什么可用动态规划 3、3个要素的分析 (1)阶段 (2)状态 (3)决策
动态规划(提高组)
绍兴柯桥中学
吴建锋
部分背包问题
N个物品,每个物品有总价值a[i]和体积
v[i],背包的总体积是W,每个物品可以部 分拿取,问最大可以获得价值。
部分背包问题
1、获取价值最大,就是在装满背包的前
提下获得总价值最大 2、要使总价值最大,显然要使单位体积 的价值含有量最大 3、因为物品可以一份份取,导致每个物 品装入时的性价比是固定的(就是a[i]/v[i])
难度是子状态的转移,上一个子状态就是j-v[i], 因为v[i]装入前,背包被占用体积就是j-v[i]。
可以和tom问题中的状态转移联系起来,当前任务完成 的前一个子状态就是当前时刻减去当前任务占用时间
01背包的又一个程序
For i:=1 to n do Begin for j:=0 to v[i]-1 do f[I,j]:=f[i-1],j];
经典问题的应用:石子归并
在一个操场上摆放着一排n(n≤20)堆石
Leabharlann Baidu
子。现要将石子有次序地合并成一堆。规 定每次只能选相邻的2堆石子合并成新的 一堆,并将新的一堆石子数记为该次合并 的得分。 试编程求出将n堆石子合并成一堆的最小 得分。
模型分析
1、任意两堆石子的合并就是两个矩阵的
相乘。
2、更为简单的是,这里只是石子数的累
提炼出状态转移方程
用w[i]保存第i种彩石的重量,用p[i]表示它
的价值,用j表示状态,则状态转移方程如 下: f[I,j]=max{f[i-1,j-w[i]]+p[i],f[i-1,j]}
核心程序代码
fillchar(f,sizeof(f),0); for i:=1 to n do for j:=1 to w do
前期分析
1、什么是矩阵乘法 2、乘法次数的统计原理
算法分析
1、阶段。分相邻二个矩阵相乘、相邻三
个相乘、……n个矩阵相乘来划分阶段。
2、状态。连乘矩阵的起始和终止编号。
3、决策。在i和j矩阵之间如何组合。
状态转移方程
1、f[I,j]表示第i个矩阵到第j个矩阵连乘的
最少次数。 2、a[i].x a[i].y表示第i个矩阵的行号和列 号 3、转移方程: F[I,j]=min{F[I,k]+f[k+1,j]+ai.x*ai.y*aj.y}
扩展01背包问题
1、k=0时表示物品i不取,则对应的
f[I,j]=f[i-1,j] 2、k>0时,表示物品i装入了被占用j体积 的背包中有k个,这个决策对应的上个可 能的子状态是:背包被占用体积是j-v[i] (可以不管当前装入的物品i已经装入几个 了)。对应的最优解就是:f[I,j]:=f[I,jv[i]]+a[i]
枚举状态(当前背包被 占用体积) 当前物品不装入背包的最大总价值就是 前i-1个物品装入背包的最大值。
if (j>=v[i]) and (f[i-1,j-v[i]]+a[i]>f[I,j])
then f[I,j]:= f[i-1,j-v[i]]+a[i]>f[I,j] end; 把当前背包不装入和装入进行比较,哪个更大,
总体算法分析
1、先用循环求得所有的f[I,i+1],1<=i<n 2、以合并包含的原始石子堆的数量为阶
段(从3到n),进行动态规划求解。 3、输出f[1,n]。
TOM的烦恼
Tom是一个非常有创业精神的人,由于大学学的
是汽车制造专业,所以毕业后他用有限的资金开 了一家汽车零件加工厂,专门为汽车制造商制造 零件。由于资金有限,他只能先购买一台加工机 器。现在他却遇到了麻烦,多家汽车制造商需要 他加工一些不同零件(由于厂家和零件不同,所 以给的加工费也不同),而且不同厂家对于不同 零件的加工时间要求不同(有些加工时间要求甚 至是冲突的,但开始和结束时间相同不算冲突)。
Tom当然希望能把所有的零件都加工完,
前i个物品装入j体积的背包中的最大值, 而不是第i个物品装入j中的最大值。
扩展01背包问题
N种物品,每种有无穷多个,价值为a[i],
单个体积为v[i],装入总体积为W的背包, 求最大价值和。
扩展01背包问题
穷举所有阶段I
{物品编号} 穷举状态j {当前背包被占用} 穷举决策k {k:=0 to w/v[i]} 根据决策转移状态到上个可以的子状 态,比较各个状态转移后的最优解f[I,j]; end; end; End;