算法学习——递推1

递推,顾名思义,就是从一个小问题一步步推出问题的结果。在这个过程中,最主要的就是发现其中的递推关系。

给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使当n>n0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来,这样的式子就叫做递推关系。

来看一个问题:“未名湖边的烦恼”

问题描述:

  每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
  每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)

输入格式

  两个整数,表示m和n

输出格式

  一个整数,表示队伍的排法的方案数。

样例输入

3 2

样例输出

5

数据规模和约定: m,n∈[0,18]

分析:首先很明显的一点,这个问题中m必须不小于n,否则有0种排法。为了找到其中的递推关系,我们先假定还鞋的人i=1(i=1->m),这时无论j=0或1(j=1->n),排法f[i][j]始终等于1(还鞋的人排在前),在往前推的过程中,我们发现当i=j时,意味着这一步中的最后一名一定是一个租鞋的人(因为m必须>=n),那么将这最后一名去掉对前面的排法没有任何影响,故有一个递推关系:当i=j时,f[i][j]=f[i][j-1];而当i>j时,我们不知道往这步推的时候,新加入的人是还鞋的还是租鞋的,故有,当i>j,f[i][j]=f[i-1][j]+f[i][j-1]; 至此,递推关系已经很明朗了。

以下是实现代码:

#include"iostream"
using namespace std;
int main()
{
    int m,n;
    cin>>m>>n;
    int a[19][19]={0};
    for(int i=1;i<=m;i++)
        a[i][0]=1;    //预处理
    for(int i=1;i<=n;i++)
        a[0][i]=1;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
        {
            if(i==j)
                a[i][j]=a[i][j-1];
            else if(i>j)
                    a[i][j]=a[i-1][j]+a[i][j-1];
        }
    cout<<a[m][n];
    return 0;
}    
时间: 2024-10-13 22:31:39

算法学习——递推1的相关文章

算法学习——递推之超级素数

算法描述 超级素数定义: m位超级素数本身是素数 最高位开始,去掉一位为m-1位的素数-- 例: 103不是超级素数,去掉最高位的1之后为3,不是有个2位素数,137是一个三位超级素数,去掉最高位1之后为37,37是一个二位素数,去掉3之后为7,7也是一个素数 要求: 输入整数m(1 < m<=10),统计m位超级素数的个数,并输出其中最大的m位超级素数 算法思路 设置一个判断素数的方法 1位素数只有3个,3,5,7,我们可以推测,2位超级素数的个位数只能是3,5,7,没有其他的选择了,同理,

滑动平均滤波算法(递推平均滤波法)

//滑动平均滤波算法(递推平均滤波法) //ADNum为获得的AD数 //GN为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 const int GN = 12; int filterPtr = 0; bool isFirst = true; public float gSum = 0; float[] gbuf  = new float[GN]; float GlideFilterAD(float ADNum) { if (isFirst) { isFirst =

滑动平均滤波算法(递推平均滤波法)(转帖)

//滑动平均滤波算法(递推平均滤波法)--C语言版 int FilterI=0; //ADNum为获得的AD数 //n为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 int GlideFilterAD(int value_buf[],int n,int ADNum) { int sum=0; value_buf[FilterI++]=ADNum; if(FilterI==n) FilterI=0; //先进先出,再求平均值 for(int count=0;count

数据结构与算法之递推算法 C++与PHP实现

数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的.往往是在发展一种算法的时候,构建了适合于这种算法的数据结构.一种数据结构如果脱离了算法,也就没有存在的价值了. 算法的作用----解决任何一个实际问题,都不可避免地涉及到算法的问题,通过一定的算法,得到一个最优(或较优)的方案. 递推算法:递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法. 顺推法:从已知条件出发,逐步推算出要解决的问题的方法. 逆推法:从已知问题的结果出发,用迭代表达式逐步推算

算法入门——递推

主要思想: 通过已知的条件(已知结果),利用特定的关系,逐步递推(顺推/逆推),直到有解或者无解. 主要分为两种:顺推,从已知条件出发,直至推出解. 逆推,从已知结果出发,直至推出解. 需要注意的:每一递推结果,都是下一步递推的条件. 顺推: 斐波那契数列  F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*) 实例 兔子的总数有多少? 一对兔子,每月能生一对,而每对兔子3个月后可以生育.求12个月后共有多少兔子. #include<stdio.h> #define

01python算法之递推

递推 1什么是递推?:根据已有节点的值,以及规律推出之后节点的值 2为什么要用递推:简单的解决有规矩事件 3怎么用?: 我们举个经典的例子: 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月就可以生1对小兔子,如果从1对初生的小兔子开始,1年后能繁殖多少兔子? def my1(max): a ,b,c ,i= 1,0,0 0 while i<max: c = c+b b = a a = c print a+b+c i+=1 方法:我们可以把兔子分为1个月大的,2个月大的,3个月大的

算法之——————递推的简单解释

1.顺推法:已知条件,逐步到结果,也叫迭代法,转转相除 2.逆推法:已知结果,推条件 步骤 1:确定迭代变量 2:建立迭代关系式 3:迭代过程的控制:1是计数型循环控制2,条件循环解决迭代次数无法确定的问题 关键:有迭代过程,循环结构 递推过程找迭代关系式,循环控制好迭代过程 顺推: 谷角猜想:编程打印出过程: 1 #include<stdio.h> 2 //#include<malloc> 3 #include<string.h> 4 int main() 5 { 6

算法之递推思想

一: 概念 通过已知条件,利用特定关系逐步递推,最终得到结果为止,核心就是不断的利用现有信息推导出新的东西. 二:分类 当然递推中有两种,"顺推"和"逆推" 顺推:从条件推出结果. 逆推:从结果推出条件. 三: 举例 <1> 顺推的例子 上过大学的应该都知道著名的"斐波那契"数列吧,说的是繁殖兔子的问题,题目我就大概说一下. 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月就可以生1对小兔子,如果从1对初生的小兔子开始,

蓝桥杯 算法提高 递推求值

思路: 矩阵快速幂. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 using namespace std; 5 6 typedef long long ll; 7 typedef vector<ll> vec; 8 typedef vector<vec> mat; 9 10 const int mod = 99999999; 11 12 mat mul(m