版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
动态规划初步动态规划初步引入:走楼梯已知一个楼梯有n级,从下往上走,一步可以走一级,也可以走两级,走到第N级楼梯有多少种走法?【输入格式】一行一个整数n。【输出格式】一行仅有一整数,表示走到第n级有多少种走法。【输入样例】【输出样例】22【数据规模】对100%的数据满足:0<n≤30。引入:走楼梯已知一个楼梯有n级,从下往上走,一步可以走一级,最短路径问题---求A到E的最短路的长度穷举?贪心?搜索?最短路径问题---求A到E的最短路的长度穷举?贪心?搜索?思考:
仔细观察本图路径的特殊性,可以分成4个阶段:第一阶段:A经过A-B1或A-B2到B第二阶段:B1有三条路通……;B2有两条通路……阶段1阶段2阶段3阶段4思考:仔细观察本图路径的特殊性,可以分成4个阶段:阶段1阶思考:倒着推;设F(x)表示x到E的最短路径的长度阶段4:F(D1)=3;F(D2)=4;F(D3)=3阶段3:F(C1)=min{F(D1)+C1到D1的路径长度,
F(D2)+C1到D2的路径长度}F(C2)……阶段1阶段2阶段3阶段4思考:倒着推;设F(x)表示x到E的最短路径的长度阶段4:F信息学奥赛NOIP动态规划入门ppt课件
我们把F(x)
称为当前x的状态;在这个例子中每个阶段的选择依赖当前的状态,又随即引起状态的转移,一个决策序列(E–D3-C4-B2-A)就是在变化的状态中产生的,故有“动态”的含义。阶段1阶段2阶段3阶段4我们把F(x)称为当前x的状态;阶段1阶段2阶段3阶段基本概念阶段:问题的过程被分成若干相互联系的部分,我们成为阶段,以便按一定的次序求解。状态:
某一阶段的出发位置称为状态,通常一个阶段包含若干状态。决策:
对问题的处理中作出的每种选择的行动就是决策。即从该阶段的每个状态出发,通过一次选择性的行动移至下一个阶段的相应状态。基本概念阶段:IntF(intn)
{
if(n==0||n==1)return1;
elsereturnF(n-1)+F(n-2);
}时间复杂度?能优化吗?例1:斐波那契(Fibonacci)数列IntF(intn)时间复杂度?能优化吗?例1:斐波那例1:斐波那契(Fibonacci)数列//dp数组,用以保存已经计算过的结果//dp[n]记录F(n)的结果,dp[n]=-1表示没有计算过IntF(intn){
if(n==0||n==1)return1;
if(dp[n]!=-1)returndp[n];
else{
dp[n]=
F(n-1)+F(n-2);
returndp[n];
}}时间复杂度?例1:斐波那契(Fibonacci)数列//dp数组,用以
例2:数字三角形
一个由非负数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有个数,从第一行的数开始,每次可以选择向左下或是向右下走一格,一直走到最下行,把沿途经过的数全部加起来。如何走才能使得这个和尽量大?。数字三角形格子编号穷举?贪心?搜索?数组存储例2:数字三角形数字三角形格深搜(递归实现)程序清单:voidf(inti,intj){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];}}格子编号深搜(递归实现)格子编号分析:考察设以格子(i,j)为首的“子三角形”的最大和为d[i,j](我们将不加区别的把这个子问题(subproblem)本身也称为d[i,j]),则原问题的解是d[1,1]我们关心的是从某处出发到底部的最大和:从(2,1)点出发的最大和记做d[2,1];从(2,2)点出发的最大和记做d[2,2];从(1,1)出发有两种选择(2,1)或(2,2)在已知d[2,1]和d[2,2]的情况下,应选择较大的一个。分析:考察设以格子(i,j)为首的“子三角形”的最大和为d[思考:考虑更一般的情况,当前位置(i,j)看成一个状态,
定义状态(i,j)的指标函数d(i,j)
为从格子(i,j)出发时能得到的最大和(包含格子(i,j)本身的值)。
原题的解:?d(?,?)格子编号d[1,1]格子编号d[1,1]思考:观察不同状态如何转移的。
从格子(i,j)出发有两种决策。如果(i,j)格子里的值为a(i,j)
向左走需要求“从(i+1,j)出发的最大和”,就是d[i+1,j]。向右走需要求“从(i+1,j+1)出发的最大和”,就是d[i+1,j+1]。
如何选呢?
思考:边界条件?其中较大的一个,再加上a(i,j)的值就是d[i,j]。d[i,j]=a[i,j]+max{d[i+1,j],d[i+1,j+1]}思考:观察不同状态如何转移的。思考:边界条件?其中较思想:从上向下思考,从底向上计算数字三角形81321162324思想:从上向下思考,从底向上计算数字三角形813211623时间复杂度O(n2)
在计算d[i][j]前,d[i+1][j],d[i+1][j+1]已计算好了!
方法1:递推计算voidsolve(){inti,j;for(j=1;j<=n;j++)d[n][j]=a[n][j];for(i=n-1;i>=1;i--)for(j=1;j<=i;j++)d[i][j]=a[i][j]+max(d[i+1][j],d[i+1][j+1]);}时间复杂度O(n2)方法1:递推计算voidsolve(
dt(1,1)的调用关系树重复计算intsolve(inti,intj){if(i==n)returna[i][j];elsereturna[i][j]+max(solve(i+1,j),solve(i+1,j+1));}方法2:递归计算这样做是正确的,可惜时间效率太低。低效的原因在于重复计算。dt(1,1)的调用关系树重复计算intsolve(这个方法和直接递归非常类似,但加入了记忆化(memoization),保证每个结点只访问一次。//initially,alld[i][j]are-1intsolve(inti,intj){if(i==n)returna[i][j];if(d[i][j]>=0)returnd[i][j];d[i][j]=a[i][j]+max(solve(i+1,j),solve(i+1,j+1));returnd[i][j];}
时间复杂度O(n2)
不必事先确定各状态的计算顺序方法3:记忆化搜索这个方法和直接递归非常类似,但加入了记忆化(me动态规划基本思想
建立子问题的描述,建立状态间的转移关系,使用递推或记忆化搜索法来实现。状态定义用问题的某些特征参数描述一个子问题。在本题中用d[i,j]表示以格子(i,j)为根的子三角形的最大和。在很多时候,状态描述的细微差别将引起算法的不同。状态转移方程即状态值之间的递推关系。这个方程通常需要考虑两个部分:一是递推的顺序,二是递归边界(也是递推起点)。从直接递归和后两种方法的比较可以看出:重叠子问题(overlappingsubprob-lems)是动态规划展示威力的关键。动态规划基本思想建立子问题的描述,建立状态间的转考察:d(1,1);d(2,1);d(2,2)……这些问题的共性:都是求从一个位置出发到底部的最大值;是一个共同的问题。d(2,1)d(2,2)重叠子问题考察:d(1,1);d(2,1);d(2,2)……这些问题的考察:d(1,1);d(2,1);d(2,2);可以发现每个子问题结果都是最优的。d(2,1)d(2,2)最优子结构考察:d(1,1);d(2,1);d(2,2);可以发现每个什么是动态规划?动态规划是求解包含重叠子问题的最优化方法动态规划的性质?
子问题重叠性质:在用递归算法自顶向下对问题进行求解是,每次产生的子问题并不总是新问题,有些子问题可能被重复计算多次。动态规划算法利用此性质,对每个子问题只计算一次,然后将其结果保存起来以便高效重用。
最优化子结构性质:若问题的最优解所包含的子问题的解也是最优的,则称该问题具有最优子结构性质(即满足最优化原理)。能用动态规划解决的求最优解问题,必须满足最优解的每个局部也都是最优的什么是动态规划?动态规划是求解包含重叠子问题的最优化方法无后效性:即某阶段的状态一旦确定,则此后过程的演变不再受此前各状态及决策的影响。也就是说,“未来与过去无关”,当前的状态是此前历史的一个完整总结,此前的历史只能通过当前的状态去影响过程未来的演变。数字三角形如果数字三角形(有负数)求的是从上到下的和最接近零。就不符合无后效性原则。无后效性:即某阶段的状态一旦确定,则此后过程的演变不动态规划的优势1.动态规划比穷举具有较少的计算次数
从数塔问题可以看出,层数为k时,
穷举算法求路径的条数2k-1
动态规划计算的次数为:
穷举最多计算到n=20,动态规划可以算到n=1002.递归需要很大的栈空间,而动规的递推法不需要栈空间;使用记忆化搜索比较容易书写程序。动态规划的优势1.动态规划比穷举具有较少的计算次数思考:
还有一种思考方法,从下向上考虑,观察不同状态如何转
移的。从格子(i,j)出发有两
种决策。
思考:边界情况:??思考:最后的结果:??d[1][1]=a[1][1]d[i][1]=d[i-1][1]+a[i][1]{第1列}d[i][i]=d[i-1][i-1]+a[i][i]{对角线}max{d[n][1],d[n][2]……d[n][n]}d(i,j)为:取d(i-1,j)
和d(i-1,j-1)中较大的一个加上a(i,j)的和。这种方法本质就是递推思考:还有一种思考方法,从下思考:边界情况:??思考:最后例3:最大连续子序列和(MaximumContinuousSubsequenceSum)给定k个整数的序列{A1,A2,...,Ak},其任意连续子序列可表示为{Ai,Ai+1,...,Aj},其中1<=i<=j<=k。最大连续子序列是所有连续子序中元素和最大的一个。
例如给定序列{-2,11,-4,13,-5,-2},其最大连续子序列为{11,-4,13},最大连续子序列和即为20。
暴力枚举?时间复杂度为?能优化吗?复杂度?例3:最大连续子序列和(MaximumContinuous令状态dp[i]表示以A[i]作为末尾的连续序列的最大和(A[i]必须作为序列的末尾)。以样例为例,序列{-2,11,-4,13,-5,-2},下标分别设为:0,1,2,3,4,5;dp[0]dp[1]dp[2]dp[3]dp[4]dp[5]问题转换为dp[0],dp[1],…,dp[n-1]中的最大者。最大连续子序列和(MaximumContinuousSubsequenceSum)令状态dp[i]表示以A[i]作为末尾的连续序列的最大和(Adp[i]表示以A[i]作为末尾的连续序列的最大和(A[i]必须作为序列的末尾);只有两重情况:1、这个最大和的连续序列只有一个元素,即以A[i]开始,以A[i]结尾;最大和就是A[i]本身。2、这个最大和的连续序列有多个元素,从前面某处A[p]开始(p<i);一直到A[i]结尾。也就是
dp[i-1]+A[i];
A[p]+…+A[i-1]+A[i]=dp[i-1]+A[i];最大连续子序列和(MaximumContinuousSubsequenceSum)dp[i]表示以A[i]作为末尾的连续序列的最大和(A[i]转移方程:
dp[i]=max{A[i],dp[i-1]+A[i]}
边界:dp[0]=A[0]最大连续子序列和(MaximumContinuousSubsequenceSum)代码:
dp[0]=A[0];
for(inti=1;i<n;
i++){dp[i]=max(A[i],dp[i-1]+A[i])}
结果?转移方程:最大连续子序列和(MaximumContinuo动态规划的核心设计状态
和状态转移方程动态规划的核心设计状态问题描述:拦截导弹(NOIP1999):某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹的枚数和导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,每个数据之间有一个空格),计算这套系统最多能拦截多少导弹?样例输入:
838920715530029917015865样例输出:
6(最多能拦截的导弹数)
例4:最长下降序列问题描述:拦截导弹(NOIP1999):样例输入:例4:最长题目分析:给定一个正整数序列,求出其中最长下降序列:例如:3892071553002991701586538930029917015865所求的问题:从某一个位置开始的最长下降序列寻找一个状态?
设d(i)表示从结点i出发的最长下降序列
从d(1)位置出发,考察下一步:
389207155300499170d(1)=Max{d(2)、d(3)、d(4)、d(6)}+1题目分析:设d(i)表示从结点i出发的最长下降序列从d(1)考虑更一般的情况:
d(i)=
Max{d(j)}+1并且a[i]>=a[j]同时j>i
初始化
d(i)=
1
for(inti=n-1;i<=1;i--)
{
max=0;k=0;for(intj=i+1;j<=n;j++)if(a[j]<=a[i])&&(d[j]>max){
max=d[j];k=j;
};
d[i]=max+1;
c[i]=k;记录前驱}从n-1开始递推考虑更一般的情况:d(i)=Max{d(j)}+1并且a[考虑更一般的情况:
d(i)=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年锅炉事故风险辨识与紧急停炉措施
- 上海立达学院《AutoCAD 绘图》2025-2026学年第一学期期末试卷(A卷)
- 2026年防止交叉污染卫生控制程序
- 2026年承包商(外协单位)安全准入与管理全流程
- 自修复纤维单体的功能化改性
- 上海立信会计金融学院《Access 数据库技术》2025-2026学年第一学期期末试卷(B卷)
- 上海科技大学《安装工程施工》2025-2026学年第一学期期末试卷(B卷)
- 大连东软信息学院《Access 数据库》2025-2026学年第一学期期末试卷(B卷)
- 2026年留守儿童心理健康辅导志愿者培训计划
- 上海科技大学《Android 高级应用开发》2025-2026学年第一学期期末试卷(B卷)
- 2026贵州黔南州企事业单位人才引进268人备考题库附答案详解(突破训练)
- 2026国家中医药管理局监测统计中心招聘应届高校毕业生(第二批)重点基础提升(共500题)附带答案详解
- 四年级下册数学运算定律拓展课件·跨学科主题式教学设计【人教版】
- 房屋市政工程有限空间识别及施工安全作业指南
- (二模)宁波市2026届高三高考模拟考试政治试卷(含答案)
- GB/T 2970-2016厚钢板超声检测方法
- 智能农业实验报告
- GB/T 23445-2009聚合物水泥防水涂料
- 人工神经网络HOPFIELD神经网络
- 中小学生励志主题班会课件《告诉你孩子:几年的放纵-换来的是一生卑微和坎坷》
- 022pet热灌装饮料生产工艺及品质控制
评论
0/150
提交评论