动态规划的几种典型模型
动态规划的分类解析
ans = max(ans, f[i]); printf(“%d\n“, ans);
最低通行费
一个商人穿过一个 N*N 的正方形的网格,去参与一个 特别重要的商务活动。他要从网格的左上角进,右下 角出。每穿越中间1个小方格,都要花费1个单位时间。 商人必需在(2N-1)个单位时间穿越出去。而在经过中 间的每个小方格时,都需要缴纳肯定的费用。
opt[i]=opt[k]+bri[i];
以上都是线性动规的一些例 题,它们的根底时间简单度 都是O(N2)
装箱问题
有一个箱子容量为maxv(正整数, maxv≤20230),同时有n件物品(0≤n≤30), 每件物品有一个体积vi(正整数) 。要求从 这n件物品中任取假设干件装入箱内,使 箱子的剩余空间最小。
这是线性动态规划的经典例题。
代码
for (int i = 1; i <= n; i++) scanf(“%d“, &a[i]);
for (int i = 1; i <= n; i++) { int mx = 1; for (int j = 1; j < i; j++) if (a[j] >= a[i]) mx = max(mx, f[j] + 1); f[i] = mx;
假设s1‥si(2≤i≤n)中插入j个乘号,其中s1‥sk 中插入了j-1个乘号,即乘式中的第j+1项为 sk+1‥si(j≤k≤i-1):
分析
设 ans[i][j]——长度为i的数串中插入j个乘
号的最大乘积〔整型数组〕。明显 ans[i][0]=s1..si对应的整型数组; ans[i][j]=max{ans[k][j-1]×sk+1..si}
经典算法——动态规划教程
动态规划是对最优化问题的一种新的算法设计方法。
由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的没计法对不同的问题,有各具特色的表示方式。
不存在一种万能的动态规划算法。
但是可以通过对若干有代表性的问题的动态规划算法进行讨论,学会这一设计方法。
多阶段决策过程最优化问题——动态规划的基本模型在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。
因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。
当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。
这种把一个问题看做是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策最优化问题。
【例题1】最短路径问题。
图中给出了一个地图,地图中每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路的长度。
现在,想从城市A到达城市E,怎样走路程最短,最短路程的长度是多少?【分析】把从A到E的全过程分成四个阶段,用k表示阶段变量,第1阶段有一个初始状态A,两条可供选择的支路ABl、AB2;第2阶段有两个初始状态B1、 B2,B1有三条可供选择的支路,B2有两条可供选择的支路……。
用dk(x k,x k+1)表示在第k阶段由初始状态x k到下阶段的初始状态x k+1的路径距离,Fk(x k)表示从第k阶段的x k到终点E的最短距离,利用倒推方法求解A到E的最短距离。
具体计算过程如下:S1:K=4,有:F4(D1)=3,F4(D2)=4,F4(D3)=3S2: K=3,有:F3(C1)=min{d3(C1,D1)+F4(D1),d3(C1,D2)+F4(d2)}=min{8,10}=8F3(C2)=d3(C2,D1)+f4(D1)=5+3=8F3(C3)=d3(C3,D3)+f4(D3)=8+3=11F3(C4)=d3(C4,D3)+f4(D3)=3+3=6S2: K=2,有:F2(B1)=min{d2(B1,C1)+F3(C1),d2(B1,C2)+f3(C2),d2(B1,C3)+F3(C3)}=min {9,12,14}=9F2(m)=min{d2(B2,c2)+f3(C2),d2(B2,C4)+F3(C4)}=min{16,10}=10S4:k=1,有:F1(A)=min{d1(A,B1)+F2(B1),d1(A,B2)+F2(B2)}=min{13,13}=13因此由A点到E点的全过程的最短路径为A—>B2一>C4—>D3—>E。
6动态规划模型举例
的资源B同时分配给n个用户,已知第k用户利用数量uk的 资源A和数量vk 的资源B时,产生的效益为gk(uk, vk ),问
9/16/2010 17
如何分配现有资源使总效益最大。 解:这本来是个典型的静态规划问题: Max Z =
n
n
∑g
k =1
k
(u k , v k )
(1)
s.t
∑u
k =1
k
k=2时 ,
f 3 ( C 4 ) = 12 , u 3 ( C 4 ) = D 3 , f2(B1)=13,u2(B1)=C2
f2(B2)=16,u2(B2)=C3 k=1时, f1(A)=18 ,u1(A)=B1, 于是从A到G的最短距离为f1(A)=18,而最短路线则由 A开始顺次找出最优决策来确定,即u1(A)=B1,u2(B1)=C2, u3(C2)=D1,u4(D1)=E2,u5(E2)=F2,u6(F2)=G,最短路线为 A——B1——C2——D1 ——E2——F2——G。
(3)汽车刚买来时故障少、耗油低,出车时间长, 处理价值和经济效益高。随着使用时间的增加则变得 故障多,油耗高,维修费用增加,经济效益差。使用 时间俞长,处理价值也俞低。另外,每次更新都要付 出更新费用。因此,应当如何决定它的使用年限,使 总的效益最佳。 动态规划模型是解决这类问题的有力工具。下面 结合具体例子阐述建立动态规划模型的思路。 例13 最短路问题。图2是一个线路网,连线上的数 字表示两点之间的距离(或费用),寻找一条由A到 G的路线,使距离最短(或费用最省)。
动态规划(2)——常见动态规划模型
动态规划(2)——常见动态规划模型1.数字三⾓形每次可以往右下或者左下⾛⼀格,求路径的最⼤权值.d(i,j)=max(d(i+1,j),d(i+1,j+1))+a(i,j).边界是d(n+1,j)=0,从下往上推(因为要保证i+1⾏在第i⾏之前更新)for(int i=1;i<=n+1;++i) d[n+1][i]=0;for(int i=n;i>=1;--i){for(int j=1;j<=i;++j){d[i][j]=max(d[i+1][j],d[i+1][j+1])+a[i][j];}}2.嵌套矩形有n个矩形,每个矩形⽤⼀个⼆元组(a,b)表⽰。
我们规定矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d,或者b<c,a<d(旋转了90度)。
选出尽量多的矩形排成⼀⾏,使得除了最后⼀个之外,每个矩形都能嵌套在下⼀个矩形内。
若有多解,保证字典序尽量⼩DAG最长路问题//dp[i]表⽰的是从i点出发的最长路int dp(int x){int &ans=d[x];if(ans) return ans;for(int i=1;i<=n;++i){if(G[x][i]){ans=max(ans,dp(i)+1);//注意记录的是从终点到起点的距离,这是为了⽅便字典序最⼩⽅案的输出}}d[x]=ans;return ans;}void print(int i){printf("%d ",i);for(int j=1;j<=n;++j){if(G[i][j]&&d[j]+1==d[i]){print(j);}}}for(int i=1;i<=n;++i){scanf("%d%d",&a[i],&b[i]);if(a[i]>b[i]) swap(a[i],b[i]);}for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){if(a[i]>a[j]&b[i]>b[j]){G[j][i]=1;}}}int Max=0;int endpos;for(int i=1;i<=n;++i){if(dp(i)>Max){Max=dp[i];endpos=i;}}print(endpos);3.硬币问题f(i)=min(inf,f[i−Vi]+1|Vi<=i),g(i)=max(−inf,g[i−Vi]+1|Vi<=i)(Vi为硬币的⾯值)4.01背包已有专门专题详细讲解5.点集配对问题(状压dp)d(S) 表⽰集合S配对之后的最短距离double dis(int i,int j){return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));}int main(){int n;scanf("%d",&n);for(int i=0;i<n;++i) scanf("%d%d",&a[i].x,&a[i].y);memset(d,0x7f,sizeof(d));d[0]=0;for(int i=1;i<(1<<n);++i)//由于第⼀个点⽆论如何都是要配对的,所以⽆需枚举(否则时间复杂度会{ //乘上⼀个n)int k=0;while(!(i&(1<<k))) ++k;for(int j=k+1;j<n;++j){if(i&(1<<j)) d[i]=min(d[i],d[i^(1<<k)^(1<<j)]+dis(k,j));}}}6.最长上升⼦序列问题(LIS)初级:O(n2) (不过太不优秀了,我学会了第⼆种,就从没⽤过它)进阶:O(nlogn) d[i]表⽰以a[i]结尾的最长上升⼦序列的长度for(int i=1;i<=n;+i) g[i]=inf;for(int i=0;i<n;++i){int k=lower_bound(g+1,g+n+1,a[i])-g;d[i]=k;g[k]=a[i];}7.最长公共⼦序列问题(LCS)[ 注意:LCS有时也指最长公共后缀,与LCP最长公共前缀对应 ]for(int i=0;i<la;++i){for(int j=0;j<lb;++j){if(a[i]==b[j]){d[i][j]=max(d[i][j],d[i-1][j-1]+1);}else if(a[i]!=b[j]){d[i][j]=max(d[i-1][j],d[i][j-1]);}}}还可以滚动数组优化int f=0;for(int i=0;i<la;++i){f^=1;for(int j=0;j<lb;++j){if(a[i]==b[j]){d[f][j]=max(d[f][j],[f^1][j-1]+1);}else if(a[i]!=b[j]){d[f][j]=max(d[f^1][j],d[f][j-1]);}}}8.最⼤连续和前缀和做法:for(int i=1;i<=n;++i){scanf("%d",&a[i]);sum[i]=sum[i-1]+a[i];}int Maxn=sum[n],Max=0;for(int i=n-1;i>=1;--i){Max=max(Max,Maxn-sum[i]);Maxn=max(Maxn,sum[i]);}动态规划做法:d[i]表⽰以i结尾的最⼤连续和for(int i=1;i<=n;++i) scanf("%d",&a[i]);for(int i=1;i<=n;++i){d[i]=max(0,d[i-1])+a[i];}Processing math: 100%。
动态规划
动态规划动态规划模型的分类:以“时间”角度可分成:离散型和连续型。
从信息确定与否可分成:确定型和随机型。
从目标函数的个数可分成:单目标型和多目标型。
动态规划的基本模型1.多阶段决策过程的最优化问题2.动态规划的基本概念3.最优化原理与无后效性多阶段决策过程的最优化问题在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。
当然,各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展,当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线,如下图所示:最短路径问题。
下图给出了一个地图,地图中的每个顶点代表一个城市,两个城市间的一条连线代表道路,连线上的数值代表道路的长度。
现在想从城市A到达城市E,怎样走路程最短?最短路程的长度是多少?把A到E的全过程分成四个阶段,用K表示阶段变量,第1阶段有一个初始状态A,有两条可供选择的支路A-B1、A-B2;第2阶段有两个初始状态B1、B2,B1有三条可供选择的支路,B2有两条可供选择的支路……。
用DK(X,X+1)表示在第K 阶段由初始状态X到下阶段的初始状态X+1的路径距离,FK(X)表示从第K阶段的X到终点E的最短距离。
在上例的多阶段决策问题中,各个阶段采取的决策,一般来说是与阶段有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,我们称这种解决多阶段决策最优化的过程为动态规划程序设计方法。
动态规划的基本概念阶段和阶段变量:用动态规划求解一个问题时,需要将问题的全过程恰当地分成若干个相互联系的阶段,以便按一定的次序去求解。
描述阶段的变量称为阶段变量,通常用K表示,阶段的划分一般是根据时间和空间的自然特征来划分,同时阶段的划分要便于把问题转化成多阶段决策过程,如上题中,可将其划分成4个阶段,即K = 1,2,3,4。
动态规划模型及求解方法
dh2 dx2
2x2 s2 3x22
0
解得:
2 x2 3 s2
x2=0(舍)
d 2h2 dx22
2s2
6x2
d 2h2 dx22
x2
2 3
s2
是极大值点。
x2
2 3
s2
2s2
0
f2
(s2
)
(2 3
s2
)2 (s2
2 3
s2 )
4 27
s
3 2
x2*
2 3
s2
k=1时,
f1 (s1 )
max
k=3时,
f3 (s3 )
max
x3D3 (s3
)[v3
(
x3
)
f4 (s4 )]
max(
x3 s3
x3
)
s3
k=2时,
x3*=s3
f2 (s2 )
max
x2D2 (s2
)[v2
(
x2
)
f3 (s3 )]
max
0x2 s2
(
x22
s3 )
max [
0x2 s2
x22
(s2
x2 )]
令h2(s2,x2)=x22(s2-x2)
运筹学
动态规划模型及求解方法
一、动态规划的数学模型
1. 动态规划的基本方程
设第k阶段处于状态sk,决策是uk(sk),状态转移方程为 sk+1=Tk(sk,uk),k阶段和k+1阶段的递推关系式可写为:
fk
(sk
)
opt [vk
uk Dk ( sk )
(sk
,uk
动态规划数学模型
• fk(sk)=opt{Vk,n }
3
MOR:SM
SHUFE
第一节 动态规划数学模型
例:有供应商要运输一批货物去公司,试求一条运输路径最短。
2 S1 4
4
供
应 商
阶段1
S12 7 4
3
4
S2 2
3
4
5
1 S32 5
出
口 港
阶段2
S13 1 4
6 S23
2. 动态规划模型分类
过程 变量
离散
连续
确定 离散确定型 连续确定型
随机 离散随机型 连续随机型
7
MOR:SM
• 是状态变量和相应决策变量的函数,即vk = vk(sk , xk ) 过程指标函数Vk,n
• 从第k阶段的状态sk出发到最后阶段结束的综合绩效度量 • 取决于阶段k到阶段n所采取的策略,即Vk,n (sk,xk,xk+1 ,…,sn) • 指标函数Vk,n可以是各阶段指标的和或积
最优指标函数值fk(sk)
状态表示过程发展中某阶段的起始状况 描述各阶段状态演进的变量,称为状态变量,用Sk表示
• 第 k 阶段可能有若干状态,用Sk 表示阶段k的状态集合
• sk(i)表示第k阶段的第 i 个状态
选取的状态变量必须满足无后效性
1
MOR:SM
SHUFE
第一节 动态规划数学模型
一、动态规划的基本概念
• 决策变量
变量xk(sk)表示阶段k状态sk的决策,称为决策变量,简记xk 决策变量取值被限制在某一范围内,称允许决策集合Xk(sk) 决策变量组成的序列,称为策略
动态规划:钢条切割问题
动态规划:钢条切割问题问题:Serling公司购买长钢条,将其切割为短钢条出售。
不同的切割⽅案,收益是不同的,怎么切割才能有最⼤的收益呢?假设,切割⼯序本⾝没有成本⽀出。
假定出售⼀段长度为i英⼨的钢条的价格为p i (i=1,2,…)。
钢条的长度为n英⼨。
如下给出⼀个价格表P。
给定⼀段长度为n英⼨的钢条和⼀个价格表P,求切割钢条⽅案,使得销售收益 r n最⼤。
(如果长度为n英⼨的钢条的价格p n ⾜够⼤,则可能完全不需要切割,出售整条钢条是最好的收益)⾃顶向下动态规划算法:1public static int buttom_up_cut(int[] p) {2int[] r = new int[p.length + 1];3for (int i = 1; i <= p.length; i++) {4int q = -1;5//①6for (int j = 1; j <= i; j++)7 q = Math.max(q, p[j - 1] + r[i - j]);8 r[i] = q;9 }10return r[p.length];11 }为什么长度为i时的最⼤收益 r[i] 可以通过注释①处的循环来求呢?假设长度为i时钢条被分割为x段{m1,m2,m3,...,mx}可得最⼤收益 r[i] ,取出其中⼀段mk,则最⼤收益可表⽰为r[i] = p[mk] + r[i - mk]如果r[i - mk] 不是长度为 i - mk 时的最⼤收益的话,则r[i]是长度为i时的最⼤收益也就不成⽴,所以最⼤收益r[i]⼀定可以表⽰成单独切出⼀段的价格p[mk] 加上余下长度的最⼤收益 r[i - mk]以下内容转载⾃: https:///szz715/blog/3103246前⾔众所周知,递归算法时间复杂度很⾼为(2^n),⽽动态规划算法也能够解决此类问题,动态规划的算法的时间复杂度为(n^2)。
动态规划问题常见解法
动态规划问题常见解法动态规划(Dynamic Programming)是一种常用的算法思想,用于解决一类具有重叠子问题性质和最优子结构性质的问题。
动态规划通常通过将问题划分为若干个子问题,并分别求解子问题的最优解,从而得到原问题的最优解。
以下是动态规划问题常见的解法:1. 斐波那契数列斐波那契数列是动态规划问题中的经典案例。
它的递推关系式为 F(n) = F(n-1) + F(n-2),其中 F(0) = 0,F(1) = 1。
可以使用动态规划的思想来解决斐波那契数列问题,通过保存已经计算过的子问题的结果,避免重复计算。
2. 背包问题背包问题是一个经典的优化问题,可以使用动态规划的方法进行求解。
背包问题包括 0/1 背包问题和完全背包问题。
0/1 背包问题中每个物品要么被选中放入背包,要么不选。
完全背包问题中每个物品可以被选中多次放入背包。
通过定义状态转移方程和使用动态规划的思想,可以高效地求解背包问题。
3. 最长递增子序列最长递增子序列是一个常见的子序列问题,可以使用动态规划的方法进行求解。
最长递增子序列指的是在一个序列中,找到一个最长的子序列,使得子序列中的元素按照顺序递增。
通过定义状态转移方程和使用动态规划的思想,可以有效地求解最长递增子序列问题。
4. 最长公共子序列最长公共子序列是一个经典的字符串问题,可以使用动态规划的方法进行求解。
给定两个字符串,找到它们之间最长的公共子序列。
通过定义状态转移方程和使用动态规划的思想,可以高效地求解最长公共子序列问题。
5. 矩阵链乘法矩阵链乘法是一个求解最优括号化问题的经典案例,可以使用动态规划的方法进行求解。
给定多个矩阵的大小,需要找到一个最优的计算顺序,使得计算乘积的次数最少。
通过定义状态转移方程和使用动态规划的思想,可以高效地求解矩阵链乘法问题。
以上是动态规划问题的常见解法,通过使用动态规划的思想和方法,可以解决这些问题,并求得最优解。
4种常见的动态规划模型
例谈四种常见的动态规划模型动态规划是解决多阶段决策最优化问题的一种思想方法,本文主要结合一些例题,把一些常见的动态规划模型,进行归纳总结。
(一)、背包模型可用动态规划解决的背包问题,主要有01背包和完全背包。
对于背包的类型,这边就做个简单的描述:n个物品要放到一个背包里,背包有个总容量m,每个物品都有一个体积w[i]和价值v[i],问如何装这些物品,使得背包里放的物品价值最大。
这类型的题目,状态表示为:f[j]表示背包容量不超过j时能够装的最大价值,则状态转移方程为:f[j]:=max{f[j-w[i]]+v[i]},边界:f[0]:=0;简单的程序框架为:beginreadln(m,n);for i:=1 to n do readln(w[i],v[i]);f[0]:=0;for i:=1 to m dofor j:=1 to n dobeginif i>=w[j] then t:=f[i-w[j]]+v[j];if t>f[i] then f[i]:=t;end;writeln(f[m]);end.这类型的题目应用挺广的(noip1996提高组第4题,noip2001普及组装箱问题,noip2005普及组采药等),下面一个例子,也是背包模型的简单转化。
货币系统(money)【问题描述】母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统。
他们对货币的数值感到好奇。
传统地,一个货币系统是由1,5,10,20或25,50,100的单位面值组成的。
母牛想知道用货币系统中的货币来构造一个确定的面值,有多少种不同的方法。
使用一个货币系统{1,2,5,10,..}产生18单位面值的一些可能的方法是:18×1,9×2,8×2+2×1,3×5+2+1等等其它。
写一个程序来计算有多少种方法用给定的货币系统来构造一个确定的面值。
【输入格式】货币系统中货币的种类数目是v(1≤v≤25);要构造的面值是n(1≤n≤10,000);第1行:二个整数,v和n;第2..v+1行:可用的货币v个整数(每行一个)。
动态规划模型
第2讲动态规划模型动态规划是运筹学的一个分支,它是解决多阶段决策过程最优化问题的一种数学方法。
1951年美国数学家贝尔曼(R.Bellman)等人,根据一类多阶段决策问题的特点,提出了解决这类问题的“最优性原理”,研究了许多实际问题,从而创建了解决最优化问题的一种新方法——动态规划。
动态规划可以用来解决最优路径问题、资源分配问题、生产调度问题、库存问题、装载问题、排序问题、设备更新问题、生产过程最优控制问题。
下面,以最短路径问题为例,说明动态规划的基本思想方法和特点。
(一)、最短路径问题1、问题提出如图1-10所示(P56),从0A地要铺设一条管道到6A 地,中间必须经过五个中间站,第一站可以在11,B A 两地中任选一个,类似的,第二、三、四、五站可供选择的地点分别是{}{}{}{}554443332222,,,,,,,,,,,B A C B A C B A D C B A 连接两点间的距离用图上两点连线上的数字表示,两点间没有连线的表示相应两点不能铺设管道,现要选择一条从0A 到6A 的铺 管线路,使总距离最短。
2、问题分析解决最短路径问题,最容易想到的方法是穷举法,即列出所有可能发生的方案和结果,再针对题目的要求对它们一一进行比较,求出最优方案。
这种方法,在变量(或节点)的数目较小时有效;在变量数目很大时,计算量将会变得十分庞大,行不通。
因此,需要根据问题的特性,寻求一种简便的算法。
最短路径问题有一个特性:如果最短路径在第k 站通过点k x ,则这一线路在由kx出发到达终点的那一部分线路,对于从点k x 终点的所有可能选择的不同线路来说,必定也是距离最短的。
这就是最优性原理。
这就启发我们从最后一段开始,采用从后向前逐步递推的方法,求出各点到6A 的最短线路,最后求得从0A 到6A 的最短线路。
(归结为一句话:最有策略的子策略仍然是最优策略)3、问题求解为求解方便,将整个过程分为6个阶段,用)6,,2,1( =k k 表示。
动态规划(常见基础模型)
有N种物品和一个容量为V的背包,每种物 品都有无限件可用。第i种物品的费用是c[i], 价值是w[i]。求解将哪些物品装入背包可使 这些物品的费用总和不超过背包容量,且 价值总和最大。
f[i][v]=max{f[i-1][vk*c[i]]+k*w[i]|0<=k*c[i]<=v} 这跟01背包问题一样有O(N*V)个状态需要 求解。求解状态f[i][v]的时间是O(v/c[i]),总 的复杂度是超过O(VN)的
从上面的分析可以看出这样划分问题满足 最优子结构,那满足无后效性么?显然对 于第i个数时只考虑前i-1个数,显然满足无后 效性,可以用动态规划解。
最长上升子序列
状态转移方程 f[i]=max(f[j])+1 (0<=j<i 且a[j]<a[i])
For (i=1;i<=n;i++)
第一阶段:两堆合并过程如下,其中 sum(i,j)表示从i开始数j个数的和 s[1,2]=s[1,1]+s[2,1]+sum(1,2) s[2,2]=s[2,1]+s[3,1]+sum(2,2) s[3,2]=s[3,1]+s[4,1]+sum(3,2) s[4,2]=s[4,1]+s[5,1]+sum(4,2) s[5,2]=s[5,1]+s[6,1]+sum(5,2) s[6,2]=s[6,1]+s[1,1]+sum(6,2)
算法优化
1、原算法的时间复杂度是?
2、是否有优化的余地? 3、排除重复是本题一个优化的方向
优化后的核心算法部分
动态规划模型总结
第二步:(第三、四季度) 总效果
s4 s3 u3 A3 s3 u3 500
2 f3 ( s3 ) min {0.005u3 s3 7200 11(u3 s3 500) u3 500 s3
0.005(u3 s3 500)2 } 2 2 0.01u3 0.01u3s3 16u3 0.005s3 15s3 13950
B1 1
7 1 6 C1 2 1
A
4
6
B2
B3
5
D
8
C2
d 2 (B1 ,C1 ) f3 (C1 ) 7 2 f 2 (B1 ) min min 7 6 1 d 2 (B1 ,C2 ) f3 (C2 )
决策u2(B1)=C2, 最短路线为B1—C2—D。
s2 s1 u1 600 u1 600
f1 (s1 ) min{s1 0.005u12 10000 6(u1 600)
u1 600
(0.005 3)(u1 600)2 }
f1 (0.04 3)u1 8 0 u1
u 600
代入 f1(s1) 得
决策u1(A)=B2, 最短路线为A—B2—C1—D。
动态规划的一般模型
f k (sk ) opt {dk ( sk , uk ) f k 1 (uk ( sk ))} uk Dk ( sk ) f n1 (sn1 ) 0, k n, n 1,...,1
第九节
动态规划
(Dynamic Programming).
1、 动态规划的发展及研究内容
动态规划 (dynamic programming) 是运筹学的 一个分支,是求解多阶段决策问题的最优化方法。 20世纪50年代初R. E. Bellman等人在研究多阶段决 策过程(multistep decision process)的优化问题时, 提出了著名的最优性原理(principle of optimality), 把多阶段过程转化为一系列单阶段问题,逐个求解, 创立了解决这类过程优化问题的新方法 — 动态规
动态规划模型
第2讲动态规划模型动态规划是运筹学的一个分支,它是解决多阶段决策过程最优化问题的一种数学方法。
1951年美国数学家贝尔曼(R.Bellman)等人,根据一类多阶段决策问题的特点,提出了解决这类问题的“最优性原理”,研究了许多实际问题,从而创建了解决最优化问题的一种新方法——动态规划。
动态规划可以用来解决最优路径问题、资源分配问题、生产调度问题、库存问题、装载问题、排序问题、设备更新问题、生产过程最优控制问题。
下面,以最短路径问题为例,说明动态规划的基本思想方法和特点。
(一)、最短路径问题1、问题提出如图1-10所示(P56),从0A地要铺设一条管道到6A 地,中间必须经过五个中间站,第一站可以在11,B A 两地中任选一个,类似的,第二、三、四、五站可供选择的地点分别是{}{}{}{}554443332222,,,,,,,,,,,B A C B A C B A D C B A 连接两点间的距离用图上两点连线上的数字表示,两点间没有连线的表示相应两点不能铺设管道,现要选择一条从0A 到6A 的铺 管线路,使总距离最短。
2、问题分析解决最短路径问题,最容易想到的方法是穷举法,即列出所有可能发生的方案和结果,再针对题目的要求对它们一一进行比较,求出最优方案。
这种方法,在变量(或节点)的数目较小时有效;在变量数目很大时,计算量将会变得十分庞大,行不通。
因此,需要根据问题的特性,寻求一种简便的算法。
最短路径问题有一个特性:如果最短路径在第k 站通过点k x ,则这一线路在由kx出发到达终点的那一部分线路,对于从点k x 终点的所有可能选择的不同线路来说,必定也是距离最短的。
这就是最优性原理。
这就启发我们从最后一段开始,采用从后向前逐步递推的方法,求出各点到6A 的最短线路,最后求得从0A 到6A 的最短线路。
(归结为一句话:最有策略的子策略仍然是最优策略)3、问题求解为求解方便,将整个过程分为6个阶段,用)6,,2,1( =k k 表示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 边界: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]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
• 接下来枚举每一行,每一行枚举上一行的 状态,然后进行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]表示以i为 根的子树有j个果子分给大头的最小难受值, k=0表示点i小头吃,k=1表示点i大头吃 • 但每个i有多个儿子需要考虑,这样我们需 要在这个线型结构中再次使用动态规划, 也就是枚举每一个子节点分配几个果子, 比较麻烦。所以我们又有了第二种思路, 即把这棵树转成二叉树,再使用动态规划。 • 转二叉树时,将i的第一个子节点作为左节 点,i的第一个兄弟节点作为右节点即可(具
• 当搜到x>m时,则再次计算状态值,更新 f[i+1][k] • 我们注意到,f[i+1][]只与f[i][]有关,所以将f 设为滚动数组即可
• 下面看一下代码
树状模型
• 没有上司的舞会 • 贪吃的九头龙
贪吃的九头龙
• /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) • 这样就实现了状态压缩和解压