递推专练

递推专练

——你没看错,还是原来的递归,还是原来的递推。。。

复习主题:今天,让我们来郑重其事地好好复习一下递推算法!

递推算法:客观世界中的各个事物之间,或者一个事物内部的各元素之间,往往存在着很多本质上的关联。我们设计程序前,应该要通过细心的观察、丰富的联想、不断的尝试推理,尽可能先归纳总结其内在规律,然后再把规律性的东西抽象成数学模型,最后再去编程实现。这种高端大气上档次的算法就是递推。其实说白了就是小学三年级的数学里的找规律解应用题。。。

递归与递推:递归算法是从大规模问题出发,把问题归约为小问题,以此类推,层层深入,直到一个基础问题可以直接求解,然后再层层返回,不断用已经求出的小问题的解去构造问题的解,直到初始问题被解决。从而可以看出,递归算法需要经过一个由大到小,再由小到大的问题解决过程。并且在递归过程中可能会有子问题被反复求解,造成了大量的重复计算。递推算法是直接从一个容易解决的小问题出发递进地求解规模越来越大的问题,直到初始问题被解决。从而可以看出,递推算法只经过了由小到大的问题解决过程,并且这一过程一般是直线式的,中途没有反复。其实以上全部都是废话。。。

递推例题:

#161.取数问题

题目描述

我们来玩一个游戏:自然数1到N,按顺序列成一排,你可以从中取走任意个数,但是相邻的两个不可以同时被取走。如果你能算出一共有多少种取法,那么你会被天神Lijiganjun奖励。

这一题就是最简单的递推。递推递推,顾名思义就是要递着找规律推出答案。这一题的规律很好找,就是当前项相等于前两项之和——a【i】=a【i-1】+a【i-2】。只要用表格式列出,你就会发现这其实是一道典型的斐波那契数列问题。

代码如下:

#include<bits/stdc++.h>

using namespace std;

int main()

{

  longlong a[100],i,n;

  cin>>n;

  a[1]=2;a[2]=3;

  for(i=3;i<=n;i++)

  a[i]=a[i-2]+a[i-1];

  cout<<a[n];

}

#162. 骨牌铺法

题目描述

有 1×n 的一个长方形,用一个 1×1、1×2和 1×3 的骨牌铺满方格。例如当 n=3 时为 1×3 的方格。 此时 用 1×1、1×2和 1×3 的骨牌铺满方格,共有四种铺法。

这一题就要复杂一点了吧。不过只要是递归,列表一般都能解决。列表如下:

1

2

3

4

5

6

1

2

4

7=1+2+3

13=2+4+7

24=4+7+13

然后我们会发现从第4个开始,每项等于前三项之和,无非就是“高级一点的”斐波那契数列。用别的思路或许很难,但用递推就十分容易了。

代码如下:

#include<bits/stdc++.h>

using namespace std;

int main()

{

  long long a[100]={0},i,n;

  cin>>n;

  a[1]=1; a[2]=2; a[3]=4;

  for(i=4;i<=n;i++)

  a[i]=a[i-1]+a[i-2]+a[i-3];

  cout<<a[n];

}

递推题目虽然都很短,但还是有不少难题。

#163. 平面分割

题目描述

同一平面内有 n(n≤500)条直线,已知其中 p(p≥2)条直线相交于同一点,则这 n 条直线最多能将 平面分割成多少个不同的区域?

    这一题就很麻烦了,因为有两个变量,所以常规的递推思想肯定是行不通的。但这毕竟还是递推,那就还是用常规思路来列表格。表格如下:

 

N=1

N=2

N=3

N=4

P=1

2

4

6

8

P=2

4

7

11

P=3

6

10

P=4

8

备注:因为有两个变量,所以是二维表格;“无”处是不存在的情况(不解释)。

这题想要说清楚规律十分麻烦,就不解释了。直接上代码。

代码如下:

#include<bits/stdc++.h>

usingnamespace std;

intmain()

{

  long long i,j,s,n,p;

  cin>>n>>p;

  s=2*p;

  for(i=p+1;i<=n;i++)

  s=s+i;

  cout<<s;

}

想学好递推不容易,主要就是靠多练!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值