ImageVerifierCode 换一换
你正在下载:

递推.docx

[预览]
格式:DOCX , 页数:11 ,大小:102KB ,
资源ID:7570350      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7570350.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(递推.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

递推.docx

1、递推算法递推算法 递推算法给定一个数的序列H0,H1,Hn,若存在整数n0,使当nn0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hi(0if(2)-f(1)-f(0)f(0)=1-f(1)-f(2)-f(3)f(3)=6 而递推如下: f(0)-f(1)-f(2)-f(3) 由此可见,递推的效率要高一些,在可能的情况下应尽量使用递推.但是递归作为比较基础的算法,它的作用不能忽视.所以,在把握这两种算法的时候应该特别注意。顺推法所谓顺推法是从已知条件出发,逐步推算出要解决的问题的方法叫顺推。 如斐波拉契数列,设它的函数为f(n),已知f(1)=1,f(2)=1;f(n)=f(n-2

2、)+f(n-1)(n=3,nN)。则我们通过顺推可以知道,f(3)=f(1)+f(2)=2,f(4)=f(2)+f(3)=3直至我们要求的解。逆推法所谓逆推法从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为逆推。递推算法的经典例子【案例】从原点出发,一步只能向右走、向上走或向左走。恰好走N步且不经过已走的点共有多少种走法?样例输入:N=2样例输出:result=7样例输入:N=3样例输出:result=17解题思路:要解决走N步共有多少种走法,我们在拿到题目的时候最直接的想法就是先画出当N=1、N=2、N=3。N=n时对应走法的图例, 由简单到复杂、由特殊到

3、一般的推理过程,找出规律获得解题的思路。在数学上,我们称为归纳法。如果用编程的方法来求解这样的推理题,我们把这样的求解思路 (算法)称之为递推法。递推的精髓在于f(n)的结果一般由f(n-1)、f(n-2).f(n-k)的前k次结果推导出来。我们在解决这类递推问题 时,难点就是如何从简单而特殊的案例,找到问题的一般规律,写出f(n)与f(n-1)、f(n-2).f(n-k)之间的关系表达式,从而得出求解 的结果。在历年noip的复赛当中,参赛选手对于这类题目都有这样的感受,往往花费了大量的时间来分析题目的一般规律,写出f(n)的一般表达式,而编程 实现可能只需要几分钟的时间。所以我们在平时训练

4、的时候,对于这样的递推题目,就必须掌握如何分析问题,从特殊推导出一般的规律,写出想要的关系表达式, 问题就迎刃而解了。下面是这道题解题的心得,供大家参考:(1)当N=1时,绘出走法图(图1)共有3种不同的走法,也就是黑色线条的数量,即f(1)=3(2)当N=2时,绘出走法图(图2)共有7种不同的走法,也就是绿色线条的数量,即f(2)=7(3)当N=3时,绘出走法图(图3)共有17种不同的走法,也就是红色线条的数量,即f(3)=17由此,我们不难看出,对于任何一个起点,最多可以走出3种走法,但最少必须走出2种走法。那么我们要求出f(n),实际上转换为如果我们能够得到上一步即f(n-1)有多少个终

5、点是有3种走法的,有多少个点有2种走法的,那么问题就解决了。a. 上一步,即f(n-1)有多少个终点是有3种走法的。 对于N=3时,f(n-1)=f(2), 有3个点A、B、C可以走出3种不同走法的,这3个点是怎么得到的呢?它的存在与N值有没有必然的联系?如果我们能找到它与N之间的关系,问题也就解决 了。有了这样的思路以后,我们不难找到这样的规律:如果f(n-2)存在,即上上步存在,那么从上上步出发的线路里面必然会有一条向上走的线路,而这条向 上走的线路在到达f(n-1)之后, 向f(n)出发时也必然有左、上、右这三种走法,那么我们就得出了这样的结论:当f(n-2)存在时,f(n-2)的值实际

6、上就等价于f(n-1)有多少 个终点是有3种走法。 b. f(n-1)有多少个终点是有2种走法的对于N=3时,有4个点D、E、F、G可以走出2种不同走法的,这4个点又是怎么得到的呢?它与N值有什么联系呢? 实际上我们在解决了上一个问题的时候,这个问题就变得相当容易了, f(n-1)减掉刚才有3种走法的点,剩下的点不就是只有2种走法了吗?即f(n-1)-f(n-2)。 c. 得出f(n)的一般关系式f(n)=3*f(n-2)+2*(f(n-1)-f(n-2) ) (n=3)化简:f(n)=2*f(n-1)+f(n-2) (n=3) 有一点需要补充的就是,任何递推题,都会有临界条件。当N=1时,f

7、(n)=3;,当N=2时,f(n)=7,这些都可以看成是临界条件。只有当N& gt;=3时,即上上步存在的情况下,就可以得出f(n)的一般通式:f(n)=2*f(n-1)+f(n-2) (本题还有其他的解法,同学们可以继续挖掘!)【参考程序】#include #include int main() int n; int i; int fn_1,fn_2; printf(please input n=); scanf(%d,&n); /输入任意n值 int fn=0; if(n=1) fn=3; /初始化当n=1和n=2时的临界条件 else if(n=2) fn=7; else fn_1=7;

8、 fn_2=3; for(i=3;i=3时fn的通式 fn_2=fn_1;/更新fn_1和fn_2的值 fn_1=fn; printf(一共有%d种走法!n,fn); /输出结果 return 0; 阿牛的EOF牛肉串Problem Description今年的ACM暑期集训队一共有18人,分为6支队伍。其中有一个叫做EOF的队伍,由04级的阿 牛、XC以及05级的COY组成。在共同的集训生活中,大家建立了深厚的友谊,阿牛准备做点什么来纪念这段激情燃烧的岁月,想了一想,阿牛从家里拿来了一 块上等的牛肉干,准备在上面刻下一个长度为n的只由E O F三种字符组成的字符串(可以只有其中一种或两种字符

9、,但绝对不能有其他字符),阿牛同时禁止在串中出现O相邻的情况,他认为,OO看起来就像发 怒的眼睛,效果不好。你,NEW ACMer,EOF的崇拜者,能帮阿牛算一下一共有多少种满足要求的不同的字符串吗?PS: 阿牛还有一个小秘密,就是准备把这个刻有 EOF的牛肉干,作为神秘礼物献给杭电五十周年校庆,可以想象,当校长接过这块牛肉干的时候该有多高兴!这里,请允许我代表杭电的ACMer向阿牛表示感谢!再次感谢!Input输入数据包含多个测试实例,每个测试实例占一行,由一个整数n组成,(0nxn=2*xn-1+2*xn-2#include _int64 x40 = 0, 3, 8;int main()

10、int n; for(n = 3; n != 40; +n) xn = 2 * (xn-1 + xn-2); while(scanf(%d, &n) = 1) printf(%I64dn, xn); return 0;不容易系列之(4)考新郎Problem Description国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做考新郎,具体的操作是这样的:首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;然后,让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.最后,揭开盖头,如果找错了对象就要当众跪搓

11、衣板.看来做新郎也不是容易的事情.假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.Input输入数据的第一行是一个整数C,表示测试实例的个数,然后是C行数据,每行包含两个整数N和M(1M=N=20)。Output对于每个测试实例,请输出一共有多少种发生这种情况的可能,每个实例的输出占一行。Sample Input22 23 2Sample Output13错排 + 组合数错排公式:ai=(i-1)*(ai-1+ai-2); 然后乘以从m个中挑出t个的排列组合#include int main() int a,n,m,i; _int64 p; _int64 q;

12、 _int64 cuopai22=0,0,1,2; for(i=4;in-m;i-) p*=i; for(i=m;i1;i-) q*=i; printf(%I64dn,p/q*cuopaim); return 0; 折线分割平面Problem Description我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。Input输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0n=10000),表示折线的数量。Output对

13、于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。Sample Input212Sample Output27AuthorlcySource对n取任意值时,分割平面数= 交点数 + 顶点数 + 1,我们假设f(n-1)已知,又f(n)每一条拆线与另一条拆线交点为4,则新加第N条拆线交点数增加4*(n-1)顶点数比f(n-1)多一个,故f(n)=f(n-1)+4*(n-1)+1分析:先看N条相交的直线最多能把平面分割成多少块当添加第N条只显示,为了使平面最多, 则第N条直线要与前面的N-1条直线都相交,且没有任何三条直线教育一个点。则第N条直线有N-1个交点。由于每增加N个交点,就增

14、加N+1个平面,所以用N条直线来分隔平面,最多的数是1+1+2+3+n=1+n*(n+1)/2;再看每次增加两条相互平行的直线当第N次添加时,前面已经有2N-2条直线了,所以第N次添加时,第2N-1条直线和第2N条直线都各能增加2*(n-1)+1 个平面。所以第N次添加增加的面数是22(n-1) + 1 = 4n - 2 个。因此,总面数应该是1 + 4n(n+1)/2 - 2n = 2n2 + 1如果把每次加进来的平行边让它们一头相交则平面1、3已经合为一个面,因此,每一组平行线相交后,就会较少一个面,所以所求就是平行线分割平面数减去N,为2n2 -n + 1利用上述总结公式f(n)=2n2 -n + 1#includeint main()int T,n;scanf(%d,&T);while(T-&scanf(%d,&n)!=EOF)printf(%dn,2*n*n-n+1);return 0;或者利用公式f(n)=f(n-1)+4*(n-1)+1#includeint main()_int64 s10001; int i,T,n;scanf(%d,&T);while(T-)s0=1;scanf(%d,&n);for(i=1;i=n;i+)si=si-1+4*(i-1)+1;printf(%I64dn,si-1);return 0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1