- 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)