收藏 分享(赏)

DP动态规划ACM课件.ppt

上传人:wspkg9802 文档编号:4994729 上传时间:2019-01-28 格式:PPT 页数:45 大小:585.50KB
下载 相关 举报
DP动态规划ACM课件.ppt_第1页
第1页 / 共45页
DP动态规划ACM课件.ppt_第2页
第2页 / 共45页
DP动态规划ACM课件.ppt_第3页
第3页 / 共45页
DP动态规划ACM课件.ppt_第4页
第4页 / 共45页
DP动态规划ACM课件.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、动态规划1,罗方炜,简介,DP是在20世纪50年代由一位卓越的美国数学家Richcard Bellman发明的。它作为一种重要的工具在应用数学中被广泛的应用。它不仅可以解决特定类型的优化问题,还可以作为一种通用的算法设计技术来使用。,DP的实质,利用问题的所具有的重叠子问题的性质进行记忆化求解。(用空间换时间),求Fibonacci数:f(n) = f(n-1) + f(n-2) n2f(1)=f(2)=1,常规递归,int Non_DP(int n) if (n=1 | n=2) return 1; else return Non_DP(n-1) + Non_DP(n-2); 指数级时间复杂

2、度,无法忍受,两种实现方式,自底向上(bottom up)int DP_Bottom_Up(int n) memo1 = memo2 = 1; for (int i=3; i=n; i+)memoi = memoi-1 + memoi-2;return memon; ,自顶向下(top down)int DP_Top_Down(int n) if (n = 1 | n = 2) return 1;if (memon != 0) return memon;memon = DP_Top_Down(n-1) + DP_Top_Down(n-2);return memon; ,基本概念,最短路问题,A

3、,B1,B2,C1,C2,C3,C4,D1,D2,D3,E,求A到E的最短路径。,直观的方法是用回溯法搜索。时间复杂度为指数级。低效的原因:没有充分利用重叠子问题的性质。,此图有明显的次序,可以划分为5阶段。,A,B1,B2,C1,C2,C3,C4,D1,D2,D3,E,阶段0,阶段1,阶段2,阶段3,阶段4,设 Diskx 为第k阶段城市x到城市E的最短路径长度。map i j 为i,j两个城市间的距离。递归方程为Diskx = min Disk+1y+mapx,y 此问题时间复杂度降为O(n2).,状态:贴切,简洁的描述出事物性质的单元量。例如:Disx。要求:状态与状态之间可以转移,以便

4、有初始状态逐渐转移到目标状态,找到问题的解。阶段:若干性质相近可以同时处理的状态的集合。就是计算状态的顺序。要求:每个阶段中状态的取值只与这个阶段之前的阶段中的状态有关,与这个阶段之后的阶段中的状态无关。,状态转移方程:前一个阶段中的状态转移到后一个阶段的状态得演变规律,即相邻两个阶段的状态变化方程。fk(i) = opt fk-1(j) + cost(i,j) k阶段的i状态与k-1阶段的j状态有关决策:计算每个状态时作出的选择。,适合用DP解决的问题的性质,最优子结构:若求解的问题是最优化问题,则原问题最优当且仅当自问题最优。 Mod 4 最优路径问题找出1到4的一条长度mod 4的余数最

5、小的路径。,1,2,3,4,此最优化问题不满足最优子结构,所以不适合用DP。 但如果我们增加状态的维数,将最优化问题转化成判定性问题,再运用DP,问题就可得以解决。 设 fki 为bool型数组,表示从1点到k点长度mod4为i的路径是否存在。fki= fk-1i-lenk1 | fk-1i-lenk2 | fk-1i-lenkn,无后效性:决策之取决于当前状态的特征因素,而和到达此状态的方式无关。也就是每个阶段中状态的取值只与这个阶段之前的阶段中的状态有关,与这个阶段之后的阶段中的状态无关。如果当前定义的状态不满足无后效性,应重新定义。,一维状态存储问题,硬币问题1:有n种硬币,每种硬币的面

6、值为vi元,且只有一枚,问用这n种硬币找零S元的方法数。设dij为前i种硬币组成j元的方法数。dij = di-1j + di-1j-vid00=1,d01S=0空间复杂度为O(n2),浪费!,d0=1; d1S=0;for (i=1; i=vi; j-) dj += dj-vi; ,0-1背包问题:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?,设m(i,j)是背包容量为j,可选择物品为i,i+1,,n时,0-1背包问题的最优值。 m(i,j) = max m(i+1,j), m(i+1,j-wi)+vi

7、 j=wim(i+1,j) 0wn0 i=jwn,d0c=0;for (i=1; i=wi; j-) dj = max(dj,dj-wi+vi); ,推荐题目:POJ1384 Piggy-Bank,POJ1384参考代码,#include using namespace std; int d100052; /第2维用0表示标记,1表示钱的值 int main()int x,y,weight;int w,m;int i,j,t,n;scanf(“%d“, ,硬币问题2:有n种硬币,每种硬币的面值为vi元,有mi枚,问用这n种硬币找零S元的方法数。,d0=1;d1S=0;for (i=1; i=v

8、i; j-) for(k=1;k=0) dj += dj-k*vi; ,硬币问题3:有n种硬币,每种硬币的面值为vi元,有无数枚,问用这n种硬币找零S元的方法数。,d0=1;d1S=0;for (i=1; i=vi; j-) for(k=1;k+)if (j-k*vi=0) dj += dj-k*vi;else break; ,d0=1; d1S=0;for (i=1; i=n; i+) for (j=vi;j=S; j+) dj += dj-vi; ,POJ2614 Old Wine Into New Bottles有n种小瓶子,每种瓶子容量范围是Vi1Vi2,要灌满容量为L的大瓶子。问最少

9、差多少体积没有灌满。设di表示体积为i是否可以达到。若v可取到,则di=di | di-v,d0=1;d1L=0; for(i=0;in;i+) for(j=0;j=L-vi1;j+) if (dj=1)for(k=vi1;k=vi2;k+) dj+k=1; ,POJ2614参考代码,#include using namespace std; int f450001=0,v1022; bool fff4600; int main()int i,j,k;int l,n;int ff=1;while(scanf(“%d%d“, ,最大子段和问题:给定由n个整数(可能为负整数)组成的序列a1,a2,

10、an,求该序列形如的 子段和的最大值。,设bi为到ai截至且包括ai的字段最大和。int maxsum()int sum=0,b=0;for(int i=0;i0) b+=ai; /正的就连接起来else b=ai; /不然重新来过if (bsum) sum=b; /sum记录的一直是最大的值return sum;,引申问题:最大子矩阵和问题最大m段子段和问题,最长递增子序列(LIS)常规DP,时间复杂度为O(n2)。存在一种特殊的方法,时间复杂度为O(n*logk)。,推荐题目:POJ1631 Bridging Signals,POJ1631参考代码,#include using names

11、pace std; int d40001; int main()int n,t;int i,p,num;int high,low,x;scanf(“%d“, ,二维状态存储问题,矩阵连乘问题 (MCM)A(m*n) * B(n*q) cost=m*n*q A1 (10 x 100), A2 (100 x 5), A3 (5 x 50) (A1 (A2 A3) = 100 x 5 x 50 + 10 * 100 * 50 = 75000 (A1 A2) A3) = 10 x 100 x 5 + 10 x 5 x 50 = 7500,最优子结构:,重叠子问题:,状态转移方程:,阶段划分:,推荐题目

12、:POJ1141 Brackets Sequence,POJ1141参考代码,#include #include using namespace std; int n,l; string str; int opt101101; string ds101101; char ss101; void dynamic()int i,j,k,p;for(i=1;i=l;i+)optii=1; optii-1=0; dsii-1=“;if (stri=( | stri=) dsii=“()“;else dsii=“;for(p=1;p=l-1;p+)for(i=1;i=l-p;i+)j=i+p; optij=99999999;if( (stri=(,POJ1141参考代码,for(k=i;k=j-1;k+)if(optik+optk+1joptij)optij=optik+optk+1j;dsij=dsik+dsk+1j;coutds1lendl; int main()int tt=0;gets(ss);if(strcmp(ss,“)=0)coutssendl;str=“ “; l=strlen(ss);int i;for(i=0;il;i+)stri+1=ssi;dynamic();tt+;return 0; ,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 工作计划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报