第二部分 基础算法 --> 第三章 递推算法


目录
  • 递推算法
    • 1312【例3.4】昆虫繁殖
    • 1313【例3.5】位数问题
    • 1314【例3.6】过河卒(Noip2002)
    • 1188 菲波那契数列(2)
    • 1189 Pell数列
    • 1190 上台阶
    • 1191 流感传染
    • 1192 放苹果
    • 1193 吃糖果
    • 1194 移动路线
    • 1195 判断整除
    • 1196 踩方格
    • 1197 山区建小学

递推算法

1312【例3.4】昆虫繁殖

【题目描述】科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过x个月产卵),问过z个月以后,共有成虫多少对?0≤x≤20,1≤y≤20,x≤z≤50。

【输入】x,y,z的数值。
【输出】过z个月以后,共有成虫对数。
【输入样例】1 2 8
【输出样例】37

【题解】

#include
const int N=51;
long long a[N], b[N];//成虫对数,卵对数 
int main(){
    int x,y,z; scanf("%d%d%d", &x, &y, &z);
    for(int i=1; i<=z; i++) a[i]=1, b[i]=0;//成虫,卵数初始化
    for(int i=x+1; i<=z+1; i++){
        b[i] = y*a[i-x];        //卵数与成虫数量有关
        a[i] = a[i-1] + b[i-2]; //成虫与上月成虫和前2月卵数有关
    }
    printf("%lld",a[z+1]);
    return 0;
}

1313【例3.5】位数问题

【题目描述】在所有的N位数中,有多少个数中有偶数个数字3?由于结果可能很大,你只需要输出这个答案对12345取余的值。

【输入】读入一个数N(N≤1000)。
【输出】输出有多少个数中有偶数个数字3。
【输入样例】2
【输出样例】73

【题解】


1314【例3.6】过河卒(Noip2002)

【题目描述】棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图中的C点和P1,……,P8,卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0)、B点(n, m) (n,m为不超过20的整数),同样马的位置坐标是需要给出的,C≠A且C≠B。现在要求你计算出卒从A点能够到达B点的路径的条数。

image

【输入】给出n、m和C点的坐标。
【输出】从A点能够到达B点的路径的条数。
【输入样例】8 6 0 4
【输出样例】1617
【题解】


1188 菲波那契数列(2)

【题目描述】菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。

【输入】第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 1000000)。
【输出】n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数对1000取模得到的结果。
【输入样例】

4
5
2
19
1

【输出样例】

5
1
181
1

【题解】


1189 Pell数列

【题目描述】Pell数列a1,a2,a3,...的定义是这样的,a1=1,a2=2,...,an=2an?1+an?2(n>2)。
给出一个正整数k,要求Pell数列的第k项模上32767是多少。

【输入】第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数k (1≤k<1000000)。
【输出】n行,每行输出对应一个输入。输出应是一个非负整数。
【输入样例】

2
1
8

【输出样例】

1
408

【题解】

点击查看代码

1190 上台阶

【题目描述】楼梯有n(71>n>0)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶,编程计算共有多少种不同的走法。

【输入】输入的每一行包括一组测试数据,即为台阶数n。最后一行为0,表示测试结束。
【输出】每一行输出对应一行输入的结果,即为走法的数目。
【输入样例】

1
2
3
4
0

【输出样例】

1
2
4
7

【题解】


1191 流感传染

【题目描述】有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。

【输入】
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100。
【输出】输出第m天,得流感的人数。
【输入样例】

5
....#
.#.@.
.#@..
#....
.....
4

【输出样例】

16

【题解】


1192 放苹果

1193 吃糖果

1194 移动路线

【题目描述】X桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。
小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁的右脚弄伤了,于是蚂蚁只能向上或向右移动。小明把这只蚂蚁放在左下角的方格中,蚂蚁从左下角的方格中移动到右上角的方格中,每步移动一个方格。蚂蚁始终在方格矩阵内移动,请计算出不同的移动路线的数目。
对于1行1列的方格矩阵,蚂蚁原地移动,移动路线数为1;对于1行2列(或2行1列)的方格矩阵,蚂蚁只需一次向右(或向上)移动,移动路线数也为1……对于一个2行3列的方格矩阵,如下图所示:

【输入】输入只有一行,包括两个整数m和n(0 < m+n ≤ 20),代表方格矩阵的行数和列数,m、n之间用空格隔开。
【输出】输出只有一行,为不同的移动路线的数目。
【输入样例】2 3
【输出样例】3

【题解】


1195 判断整除

【题目描述】一个给定的正整数序列,在每个数之前都插入+号或?号后计算它们的和。比如序列:1、2、4共有8种可能的序列:

(+1) + (+2) + (+4) = 7
(+1) + (+2) + (-4) = -1
(+1) + (-2) + (+4) = 3
(+1) + (-2) + (-4) = -5
(-1) + (+2) + (+4) = 5
(-1) + (+2) + (-4) = -3
(-1) + (-2) + (+4) = 1
(-1) + (-2) + (-4) = -7

所有结果中至少有一个可被整数k整除,我们则称此正整数序列可被k整除。例如上述序列可以被3、5、7整除,而不能被2、4、6、8……整除。注意:0、?3、?6、?9……都可以认为是3的倍数。

【输入】输入的第一行包含两个数:N(2 【输出】如果此正整数序列可被k整除,则输出YES,否则输出NO。(注意:都是大写字母)
【输入样例】

3 2
1 2 4

【输出样例】

NO

1196 踩方格

【题目描述】有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b、走过的格子立即塌陷无法再走第二次;
c、只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。

【输入】允许在方格上行走的步数n(n≤20)。
【输出】计算出的方案数量。
【输入样例】2
【输出样例】7

1197 山区建小学

【题目描述】政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往。已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0

【输入】
第1行为m和n,其间用空格间隔
第2行为m?1 个整数,依次表示从一端到另一端的相邻村庄的距离,整数之间以空格间隔。
例如:

10 3
2 4 6 5 2 4 3 1 3

表示在10个村庄建3所学校。第1个村庄与第2个村庄距离为2,第2个村庄与第3个村庄距离为4,第3个村庄与第4个村庄距离为6,...,第9个村庄到第10个村庄的距离为3。

【输出】各村庄到最近学校的距离之和的最小值。
【输入样例】

10 2
3 1 3 1 1 1 1 1 3

【输出样例】

18