———————————–递推———————————-
超级楼梯
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