我是靠谱客的博主 自由音响,最近开发中收集的这篇文章主要介绍递推专练#162. 骨牌铺法题目描述#163. 平面分割题目描述    这一题就很麻烦了,因为有两个变量,所以常规的递推思想肯定是行不通的。但这毕竟还是递推,那就还是用常规思路来列表格。表格如下: N=1N=2N=3N=4P=12468P=2无4711P=3无无610P=4无无无8备注:因为有两个变量,所以是二维表格;“无”处是不存在的情况(不解释)。这题想要说清楚规律十分麻烦,就不解释了。直接上代码。代码如下:#includeusingnamespace std;,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

递推专练

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

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

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

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

递推例题:

#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;

}

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

最后

以上就是自由音响为你收集整理的递推专练#162. 骨牌铺法题目描述#163. 平面分割题目描述    这一题就很麻烦了,因为有两个变量,所以常规的递推思想肯定是行不通的。但这毕竟还是递推,那就还是用常规思路来列表格。表格如下: N=1N=2N=3N=4P=12468P=2无4711P=3无无610P=4无无无8备注:因为有两个变量,所以是二维表格;“无”处是不存在的情况(不解释)。这题想要说清楚规律十分麻烦,就不解释了。直接上代码。代码如下:#includeusingnamespace std;的全部内容,希望文章能够帮你解决递推专练#162. 骨牌铺法题目描述#163. 平面分割题目描述    这一题就很麻烦了,因为有两个变量,所以常规的递推思想肯定是行不通的。但这毕竟还是递推,那就还是用常规思路来列表格。表格如下: N=1N=2N=3N=4P=12468P=2无4711P=3无无610P=4无无无8备注:因为有两个变量,所以是二维表格;“无”处是不存在的情况(不解释)。这题想要说清楚规律十分麻烦,就不解释了。直接上代码。代码如下:#includeusingnamespace std;所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部