递推小结

这篇博客总结了几个递推关系在实际问题中的应用,包括超级楼梯、骨牌铺法、数塔问题、过河卒问题和位数问题等。通过递推公式和动态规划思想解决这些问题,例如斐波那契数列、动态规划状态转移方程等。
摘要由CSDN通过智能技术生成

———————————–递推———————————-
超级楼梯

Description
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?

Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。

Output
对于每个测试实例,请输出不同走法的数量。

Sample Input
2
2
3

Sample Output
1
2

思路:
由于一次只能上两步或者一步,所以推广到一般情况到第i级可以从第i-1级跨一步上来,也可以是从第i-2级跨两步上来,所以一般式为f[i]=f[i-1]+f[i-2];即为斐波拉契数列


骨牌铺法

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

Input
包含多组测试数据。每组测试数据包含一个正整数。

Output
每组测试数据输出一个整数,占一行。

Sample Input
3

Sample Output
4
思路:
推广到一般的极限情况,当我们铺到最后一块的时候,我们可能是铺三种中的任何一块,则有三种情况:
1,铺的最后一块是1*1的,有f[i-1]种方法;
2,铺的最后一块是1*2的,有f[i-2]种方法;
3,铺的最后一块是1*3的,有f[i-3]种方法;
综上有f[i-1]+f[i-2]+f[i-3]种方法;

#include<cstdio>
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
   int n;
   long long a[109];
   a[1]=1;
   a[2]=2;
   a[3]=4;
   for(int i=4;i<=100;i++)
    a[i]=a[i-1]+a[i-2]+a[i-3];
   while(cin>>n)
   {
      cout<<a[n]<<endl;
   }
    return 0;
}

数塔问题

Description
设有一个三角形树塔,第一层1个整数,第二层2个整数,第三层3个整数,…。从第一层出发可以向下走或右下走。若要求从第一层开始,到最下一层,请找出一条路径,使路径之和最大,只要输出路径的和。

例如下图所示的树塔,从第一次出发,路径整合最大的一条路径为13,8,26,15,13,路径的和为86。

    13

    11      8

    12      7    26

      6    14    15      8

    12      7    13    24    11

Input
包含多组测试数据。每组测试数据的第一行为一个整数n(n<10),表示数塔的层数,从第2行至n+1行,每行有若干个数据,表示数塔中的数值。

Output
每组测试数据输出占一行,输出路径和最大的路径值。

Sample Input
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11

Sample Output
86

思路:
运用到动态规划的思想。我们可以从最下面的一层开始往前倒推,可以得出一般的情况的递推式:s[i-1][j]=a[i-1][j]+max(s[i][j],s[i][j+1]);

#include<cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值