NOIP基础算法--枚举、递推和递归题库.ppt

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 例题4:表达式求值 由键盘输入一个算术表达式,该表达式由数字,加(+)、减(-)、乘(*)、求商(/)运算符及小括号组成。 例如:6*(8-1)+(5-(12-7)/5)/2 请编写一个程序,计算输入表达式的值。 funtion tree(left,right:integer):integer; begin var tmp,L1,L2,p:integer; tmp:=isnum(left,right); if tmp-1 begin tree:=tmp;exit;end;//返回值 if (st[left]=()and (poskh(left,right)=right) then tree:=tree(left+1,right-1); //去掉最外层的括号 p:=findlow(left,right); //找运算级别最低的运算符 L1:=tree(left,p-1); //递归左子树 L2:=tree(p+1,right); //递归右子树 tree:=cal(L1,st[p],L2); end; 4、用于输出动态规划的中间过程 例题5:复制书稿 【问题描述】假设有m本书(编号为1,2,…m),想将每本复制一份,m本书的页数可能不同(分别是p1,p2,…pm)。任务是将这m本书分给k个抄写员(k=m),每本书只能分配给一个抄写员进行复制,而每个抄写员所分配到的书必须是连续顺序的。 复制工作是同时开始进行的,并且每个抄写员复制的速度都是一样的。所以,复制完所有书稿所需时间取决于分配得到最多工作的那个抄写员的复制时间。 试找一个最优分配方案,使分配给每一个抄写员的页数的最大值尽可能小(如存在多个最优方案,输出结果排序最小的一种)。 分析 该题中m本书是顺序排列的,k个抄写员选择数也是顺序且连续的。不管以书的编号,还是以抄写员标号作为参变量划分阶段,都符合策略的最优化原理和无后效性。考虑到k=m,以抄写员编号来划分阶段会方便些。 设f[i,j]为前i个抄写员复制前j本书的最小“页数最大数”。S[i]=a[1]+a[2]+…+a[i],则状态转移方程为: f[i,j]=min{max(f[i-1,k],S[j]-S[k])}(i-1=k=j-1) d[i,j]=k;记录第i个人的最佳位置 边界条件 f[1,i]=S[i]。 输出方案,则递归输出; procedure Print(i,j:integer) begin if i=1 then begin writeln(1,’ ‘,j);exit;end; Print(i-1,d[i,j]); writeln(d[i,j]+1,’ ‘,j); end 第四部分 归纳策略 一、归纳法的基本思想 归纳法的基本思想:是通过列举少量的特殊情况,经过分析,最后找出一般的关系。 从本质上讲,归纳就是通过观察一些简单而特殊的情况,最后总结出有用的结论或解决问题的有效途径。 二、归纳法解题的过程 细心的观察; 丰富的联想; 继续尝试; 总结归纳出结论。 二、归纳法解题的过程 归纳是一种抽象,即从特殊现象中找出一般关系。 由于在归纳的过程中不可能对所有的可能情况进行枚举,因而最后得到的结论还只是一种猜测(即归纳假设)。所以,严格说来对于归纳假设还必须加以严格的证明。 三、归纳策略解题应注意的问题 从问题的简单具体状态分析入手,目的是去寻求可以推广的一般性规律,因此应考虑简单状态与一般性状态之间的联系。 从简单状态中分析出来的规律特征应能够被验证是正确的,不能想当然或任意地提出猜想,否则归纳出来的结论是错误的,必然导致整个问题的解是错解。 四、归纳策略的应用 例题1:求前n个自然数的平方之和: S=12+22+32+……+n2 【分析】这本是一道很简单的题目,但如果能找出S值与n的关系,则此题将更进一步得到简化,由数学证明得知: (12+22+32+…+n2)/(1+2+3+…+n) =(2n+1)/3 又由于 1+2+3+…+n=n(n+1)/2,因此得到: 12+22+32+…+n2=n(n+1) (2n+1)/6 但这只是通过总结归纳而得到的一种猜测,是否正确还需证明,对归纳假设的证明通常采用数学归纳法(证略)。 例题

文档评论(0)

1亿VIP精品文档

相关文档