C语言-递推求解技术方案.ppt

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ACM程序设计 福州大学至诚学院 冯新 第五讲 递推求解 先来看一个超级简单的例题: 有5人坐在一起,当问第5个人多少岁,他说比第4个人大2岁,问第4个人多少岁,他说比第3个人大2岁,依此下去,问第一个人多少岁,他说他10岁,最后求第5个人多少岁? 显然可以得到如下公式: Fibnacci 数列: Fibnacci 数列: Fibnacci 数列: 简单思考题: 在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域。 我们先来看一下N条相交的直线最多能把平面分割成几块。 是不是这个—— F(1)=2; F(n) = F(n-1)+n; 太简单了? 例:(2050)折线分割平面 问题描述: 平面上有n条折线,问这些折线最多能将平面分割成多少块? 样例输入 1 2 样例输出 2 7 例:(2050)折线分割平面 我们不忙着解这道题。我们先来看一下N条相交的直线最多能把平面分割成几块。 例:(2050)折线分割平面 我们再来看看,每次增加的不是一条直线,而是两条相互平行的线,那又如何呢? 例:(2050)折线分割平面 再来看如果把每次加进来的平行边让它们一头相交,情况又如何呢? 思考:如何用递推解决? 另外一种结论: Zn = 2n ( 2n + 1 ) / 2 + 1 - 2n = 2 n^2 – n + 1 #include stdio.h int main() { int n, i,j,f0,f1; scanf(%d, i); while (i-- scanf(%d, n)) { f0=1; for (j=1;j=n;j++) { f1=f0+4*j-3; f0=f1; } printf(%d\n, f1); } return 0; } #include stdio.h int main() { int n, i; scanf(%d, i); while (i-- scanf(%d, n)) printf(%d\n, 2*n*n-n+1); return 0; } 总结:递推求解的基本方法: 首先,确认:能否容易的得到简单情况的解? Thank You ~ * * 如果所坐的不是5人而是n人,写出第n个人的年龄表达式。 化简后的公式: F(n)=10+(n-1)*2 f[n] = f[n-1]+2 f[1] = 10 Description 2009年到来了。经过2008年一年的修炼,数学神童倩倩终于把0到30的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i=2))的值全部给背了下来。接下来,Ths决定要考考他,于是每问他 一个数字,他就要把答案说出来, 可是Ths自己又记不住。于是他决 定编写一个程序来测验倩倩说的是 否正确。 Input 输入若干数字n(0 = n = 30), 每个数字一行。读到文件尾。 Output 输出f[n]。 Sample Input 0 1 2 3 4 5 Sample Output 0 1 1 2 3 5 即: 0、1、1、2、3、5、8、13、21、34… f[0] = 0 f[1] = 1 f[n] = f[n-1]+f[n-2] #include stdio.h int main() { int f[40]; f[0] = 0; f[1] = 1; for(int i = 2;i = 30;++ i) { f[i] = f[i-1] + f[i-2]; } int k; while(scanf(%d, k) != EOF k !=\n) { printf(%d\n, f[k]); } return 0; } 很明显,当添加第n条直线时,为了使平面最多,则第n条直线要与前面n-1条直线都相交,且没有任何三条线交于一个点。 这样,第n条直线一共有n-1个交点。我们知道,增加n个焦点,则增加n+1个平面。 所以n条直线分割平面最大数是f(n)=f(n-1)+n 或f(n)=1 + 1 + 2 + 3 + ... + n = (n2 + n + 2) / 2 化简后: F(n) = n(n+1)/2 +1; 来个稍微麻烦一些的? 很明显,当添加第n条直线时,为了使平面最多,则第n条直线要与前面n-1条直线都相交,切没有任何三条线交于一个点。

文档评论(0)

123****6648 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档