C++ 算法篇 递推

 递推 

“递推”是计算机解题的一种常用方法。利用“递推法”解题首先要分析归纳出“递推关系”。如经典的斐波那契数列问题,用 f (i)表示第 i 项的值,则 f (1) =0,f(2) =1,在 n>2 时,存在递推关系:f (n) = f(n-1) + f(n-2)。
     在递推问题模型中,每个数据项都与它前面的若干个数据项(或后面的若干个数据项)存在一定的关联,这种关联一般是通过一个“递推关系式”来描述的。求解问题时,需要从初始的一个或若干数据项出发,通过递推关系式逐步推进,从而推导计算出最终结果。这种求解问题的方法叫“递推法”。其中,初始的若干数据项称为“递推边界”。
解决递推问题有三个重点:
1、建立正确的递推关系式;
2、分析递推关系式的性质;
3、根据递推关系式编程求解。
递推法分为“顺推”和“倒推”两类模型:
1、顺推,就是从问题的边界条件(初始状态)出发,通过递推关系式依次从前往后递推出问题的解;
2、倒推,就是在不知道问题的边界条件(初始状态)下,从问题的最终解(目标状态或某个中间状态)出发,反过来推导问题的初始状态。

例1、一个数字三角形

请编一个程序计算从顶到底的某处的一条路径,使该路径所经过的数字总和最大。只要求输出总和。  

 1、 一步可沿左斜线向下或右斜线向下走;  

 2、 三角形行数小于等于100;

3、 三角形中的数字为0,1,…,99;    

测试数据通过键盘逐行输入,如上例数据应以如下所示格式输入:

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

【算法分析】 此题解法有多种,从递推的思想出发,设想,当从顶层沿某条路径走到第i层向第i+1层前进时,我们的选择一定是沿其下两条可行路径中最大数字的方向前进,为此,我们可以采用倒推的手法,设a[i][j]存放从i,j 出发到达n层的最大值,则a[i][j]=max{a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]},a[1][1] 即为所求的数字总和的最大值。

例1、铺瓷砖

【问题描述】

用红色的 1×1 和黑色的 2×2 两种规格的瓷砖不重叠地铺满 n×3 的路面,求出有多少种不同的铺设方案。
【输入格式】
一行一个整数 n,0<n<1000。
【输出格式】
一行一个整数,为铺设方案的数量模12345的结果。
【输入样例】
2
【输出样例】
3
【问题分析】
f(n) 表示 n×3 的路面有多少种不同的铺设方案。把路面看成 n 3 列,则问题可以分成两种情况考虑,一种是最后一行用 3 1×1 的瓷砖铺设;另一种是最后两行用 1 2×2 2 1×1 瓷砖铺设(最后两行就有两种铺法),第一种铺法就转换为 f(i-1) 问题了,第二种铺法就转换成 f(i-2) 的问题了。根据加法原理,得到的递推关系式为 f(i) = f(i-1) +f(i-2)×2,边界为 f(0)=1f(1)=1

 例2、彩带 

【问题描述】
        一中 90 周年校庆,小林准备用一些白色、蓝色和红色的彩带来装饰学校超市的橱窗,他希望满足以下两个条件:
(1) 相同颜色的彩带不能放在相邻的位置;
(2) 一条蓝色的彩带必须放在一条白色的彩带和一条红色的彩带中间。
    现在,他想知道满足要求的放置彩带的方案数有多少种。例如,如图 9.4-1 所示为橱窗宽度n=3 的所有放置方案,共 4 种。
【输入格式】
一行一个整数 n,表示橱窗宽度(或者说彩带数目)
【输出格式】
一行一个整数,表示装饰橱窗的彩带放置方案数。
【样例输入】
3
【样例输出】
4
【数据规模】
30% 的数据满足:1n15
100% 的数据满足:1n45
【问题分析】
         f (i) 表示宽度为 i 的橱窗( i 条彩带)的合法放置方案数, f(1) =2f(2) =2f(3) =4f(4) =6
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值