信息学奥赛NOI动态规划入门(C++)资料.ppt
《信息学奥赛NOI动态规划入门(C++)资料.ppt》由会员分享,可在线阅读,更多相关《信息学奥赛NOI动态规划入门(C++)资料.ppt(62页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、信息学奥赛NOI动态规划入门(C+)上上课课内容内容n什么是动态规划n基本概念n斐波那契数列n经典的类型我们把F(x)称为当前x的状态;在这个例子中每个阶段的选择依赖当前的状态,又随即引起状态的转移,一个决策序列(E D3-C4-B2-A)就是在变化的状态中产生的,故有“动态”的含义。阶阶段段1阶阶段段2阶阶段段3阶阶段段4int fib(int n)if(n=1|n=2)return 1;else return fib(n-1)+fib(n-2);时间复杂度?能优化吗?例例1:斐波那契(斐波那契(Fibonacci)数列)数列斐波斐波纳纳契数列契数列大量重复计算大量重复计算!如何可以使计算仅
2、需一次如何可以使计算仅需一次?例例1:斐波那契(斐波那契(Fibonacci)数列)数列/dp数组,用以保存已经计算过的结果/dpn记录F(n)的结果,dpn=-1表示没有计算过int fib(int n)if(n=1|n=2)return 1;if(dpn !=-1)return dpn;else dpn=fib(n-1)+fib(n-2);return dpn;时间复杂度?基本概念基本概念阶段:问题的过程被分成若干相互联系的部分,我们成为阶段,以便按一定的次序求解。状态:某一阶段的出发位置称为状态,通常一个阶段包含若干状态。决策:对问题的处理中作出的每种选择的行动就是决策。即从该阶段的每个
3、状态出发,通过一次选择性的行动移至下一个阶段的相应状态。例例2:数字三角形 一个由非负数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有个数,从第一行的数开始,每次可以选择向左下或是向右下走一格,一直走到最下行,把沿途经过的数全部加起来。如何走才能使得这个和尽量大?。数字三角形格子编号穷举?贪心?搜索?穷举?贪心?搜索?数组存储深搜(递归实现)程序清单:void f(int i,int j);s=s+a i j;if(i=4)if(s max)max=s;else f(i+1,j);s=s-a i+1 j;f(i+1,j+1);s=s-a i+1 j+1;格子编号分析:
4、考察设以格子(i,j)为首的“子三角形”的最大和为di,j(我们将不加区别的把这个子问题(subproblem)本身也称为di,j),则原问题的解是d1,1我们关心的是从某处出发到底部的最大和:从(2,1)点出发的最大和记做d2,1;从(2,2)点出发的最大和记做d2,2;从(1,1)出发有两种选择(2,1)或(2,2)在已知d2,1和d2,2的情况下,应选择较大的一个。思考:考虑更一般的情况,当前位置(i,j)看成一个状态,定义状态(i,j)的指标函数d(i,j)为从格子(i,j)出发时能得到的最大和(包含格子(i,j)本身的值)。原题的解:?d(?,?)格子编号d1,1 思考:观察不同状态
5、如何转移的。从格子(i,j)出发有两种决策。如果(i,j)格子里的值为a(i,j)向左走需要求“从(i+1,j)出发的最大和”,就是di+1,j。向右走需要求“从(i+1,j+1)出发的最大和”,就是di+1,j+1。如何选呢?思考:边界条件?其中较大的一个,再加上a(i,j)的值就是di,j。di,j=ai,j+maxdi+1,j,di+1,j+1思想:思想:从上向下思考,从底向上计算从上向下思考,从底向上计算数字三角形81321162324时间复杂度时间复杂度O O(n n2 2)在计算dij前,di+1j,di+1j+1已计算好了!方法1:递推计算void solve()int i,j;
6、for(j=1;j=1;i-)for(j=1;j=0)return dij;dij=aij+max(solve(i+1,j),solve(i+1,j+1);return dij;时间复杂度O(n2)不必事先确定各状态的计算顺序方法3:记忆化搜索动态规划基本思想 建立子问题的描述,建立状态间的转移关系,使用递推或记忆化搜索法来实现。状态定义用问题的某些特征参数描述一个子问题。在本题中用di,j表示以格子(i,j)为根的子三角形的最大和。在很多时候,状态描述的细微差别将引起算法的不同。状态转移方程即状态值之间的递推关系。这个方程通常需要考虑两个部分:一是递推的顺序,二是递归边界(也是递推起点)。从
7、直接递归和后两种方法的比较可以看出:重叠子问题(overlapping subprob-lems)是动态规划展示威力的关键。考察:d(1,1);d(2,1);d(2,2)这些问题的共性:都是求从一个位置出发到底部的最大值;是一个共同的问题。d(2,1)d(2,1)d(2,2)d(2,2)重叠子问题重叠子问题考察:d(1,1);d(2,1);d(2,2);可以发现每个子问题结果都是最优的。d(2,1)d(2,1)d(2,2)d(2,2)最优子结构最优子结构什么是动态规划?什么是动态规划?动态规划是求解包含重叠子问题的最优化方法 动态规划的性质?子问题重叠性质:在用递归算法自顶向下对问题进行求解是
8、,每次产生的子问题并不总是新问题,有些子问题可能被重复计算多次。动态规划算法利用此性质,对每个子问题只计算一次,然后将其结果保存起来以便高效重用。最优化子结构性质:若问题的最优解所包含的子问题的解也是最优的,则称该问题具有最优子结构性质(即满足最优化原理)。能用动态规划解决的求最优解问题,必须满足最优解的每个局部也都是最优的 无后效性:即某阶段的状态一旦确定,则此后过程的演变不再受此前各状态及决策的影响。也就是说,“未来与过去无关”,当前的状态是此前历史的一个完整总结,此前的历史只能通过当前的状态去影响过程未来的演变。数字三角形 如果数字三角形(有负数)求的是从上到下的和最接近零。就不符合无后
9、效性原则。动态规划的优势动态规划的优势1.动态规划比穷举具有较少的计算次数 从数塔问题可以看出,层数为k时,穷举算法求路径的条数2k-1 动态规划计算的次数为:穷举最多计算到n=20,动态规划可以算到n=1002.递归需要很大的栈空间,而动规的递推法不需要栈空间;使用记忆化搜索比较容易书写程序。思考:还有一种思考方法,从下 向上考虑,观察不同状态如何转 移的。从格子(i,j)出发有两 种决策。思考:边界情况:?思考:最后的结果:?d11=a11di1=di-11+ai1 第1列dii=di-1i-1+aii 对角线maxdn1,dn2dnnd(i,j)为:取d(i-1,j)和d(i-1,j-1
10、)中较大的一个加上a(i,j)的和。这种方法本这种方法本质就是递推质就是递推例例3:最大最大连续子序列和子序列和(Maximum Continuous Subsequence Sum)n给定k个整数的序列A1,A2,.,Ak,其任意连续子序列可表示为 Ai,Ai+1,.,Aj,其中 1=i=j=k。最大连续子序列是所有连续子序中元素和最大的一个。n 例如给定序列-2,11,-4,13,-5,-2,其最大连续子序列为11,-4,13,最大连续子序列和即为20。n 暴力枚举?时间复杂度为?能优化吗?复杂度?暴力枚举?时间复杂度为?能优化吗?复杂度?n令状态dpi表示以Ai作为末尾的连续序列的最大和
11、(Ai必须作为序列的末尾)。n以样例为例,序列-2,11,-4,13,-5,-2,下标分别设为:0,1,2,3,4,5;dp0dp1dp2dp3dp4dp5n问题转换为dp0,dp1,dpn-1中的最大者。最大最大连续子序列和子序列和(Maximum Continuous Subsequence Sum)dpi表示以Ai作为末尾的连续序列的最大和(Ai必须作为序列的末尾);只有两种情况:1、这个最大和的连续序列只有一个元素,即以Ai开始,以Ai结尾;最最大和就是大和就是Ai本身本身。2、这个最大和的连续序列有多个元素,从前面某处Ap开始(pi);一直到Ai结尾。也就是 dpi-1+Ai;Ap+
12、Ai-1+Ai=dpi-1+Ai;最大最大连续子序列和子序列和(Maximum Continuous Subsequence Sum)n转移方程:dpi=max Ai,dpi-1+Ai 边界:边界:dp0=A0最大最大连续子序列和子序列和(Maximum Continuous Subsequence Sum)n代码:代码:dp0=A0;for(int i=1;i n;i+)dpi=max (Ai,dpi-1+Ai)结果?结果?动态规划的核心划的核心设计状态 和状态转移方程最最长长上升子序列(上升子序列(LIS)NOI 1759n最最长长上升子序列(上升子序列(LIS)NOI 1759样例输入:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息学 NOI 动态 规划 入门 资料
限制150内