递推专题笔记

  递推说白了就是找规律,然后写出他的递推方程,有的还可以写出通项公式,然后准确预测出第n项的值。因为这种规律存在着前因后果的关系,即是说,后一项的结果往往和前一项或前几项有着某种联系。这种联系不仅仅存在于数字之中,世间万物亦是如此。

  由于,递推是深入理解动态规划的基础,就我目前的水平,看到动态规划就如看到tiger一般,完全不知所以,所以为了找回在动态规划前的自信,我打算在回家之前,找一个递推专题练练手。现记录如下:

  

  心得:

  1. 既然是递推题,那么肯定有递推方程,那么同样有规律可循,既然有规律。所以,若一时做不出来。我们可以用计算机枚举出比较的小的情况,然后找出其中规律。最后AC之。

  2.有时,当n比较大时,递推起来肯定会耗时,就有可能造成TLE,那么这时不要忘了我们的矩阵君。把数的公式用矩阵表示出来再算,那是大大的方便啊。

  整个专题地址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=65818#overview

  1. HDU 2041

  分析:容易知道,可以有两种方式走到第m阶,一是从m-1阶走一步,二是从m-2阶走两步,故F(m)=F(m-1)+F(m-2)。其中边界条件F(1)=0,F(2)=1。这道题用递归做,离线也会超时。

  2.  HDU 2042

  分析:这题直接根据题意列公式即可:3*Pow(2, n)+2-Pow(2, n+1)即是答案。

  3.     HDU 2044

  分析:我们用F(n)表示从蜂房1走到蜂房n的路线总数,根据题目条件可得,走到蜂房n只可能经过蜂房n-1和蜂房n-2,故有F(n)=F(n-1)+F(n-2)。题目要求从蜂房a到蜂房b的路线,只需分别把a,b向左移动a-1即可,即F(b-a+1)就是所求。

  4.  HDU 2045

  分析: 共三种颜色,相邻和首尾不能同色。根据题意可作出下图:

红线是非法情况,F(n)表示长为n的方格的总的合法染色数,根据图很容易知道,F(n-1)的每个合法组合分别在F(n)中会产生一个非法组合和一个合法组合,非法组合在F(n)中产生两个合法组合,所以可得公式:F(n)=Pow(2,n-1)-F(n-1)。

  我们还可以继续分析上图,F(n-1)的合法组合在F(n)中产生F(n-1)个合法组合,而其余的合法组合是F(n-1)的非法组合产生的,共有2*F(n-1)的非法组合,而F(n-1)的非法组合等于F(n-2)。故有:F(n)=F(n-1)+2*F(n-2)。

  更一般的:假设现有k种颜色,其余条件不变。有公式:F(n)=(k-2)*F(n-1)+(k-1)*F(n-2),{n>=4}。F(1)=k, F(2)=k*(k-1), F(3)=K*(k-1)*K(k-2)。

  5. HDU 2018

  分析:设F(n)表示第n年的牛的总数,显然有关系式:F(n)=F(n-1)+F(n-3),边界条件为F(1)=1,F(2)=2,F(3)=3。表示今年牛的总数等于去年牛的总数加上今年新生的牛的总数。

  

时间: 2024-08-17 04:43:59

递推专题笔记的相关文章

hdu 2044-2050 递推专题

总结一下做递推题的经验,一般都开成long long (别看项数少,随便就超了) 一般从第 i 项开始推其与前面项的关系(动态规划也是这样),而不是从第i 项推其与后面的项的关系. hdu2044:http://acm.hdu.edu.cn/showproblem.php?pid=2044 //没开成long long WA了一次 #include<iostream> #include<cstdio> #include<algorithm> #include <s

简单递推专题

Computer Transformation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6084    Accepted Submission(s): 2222 Problem Description A sequence consisting of one digit, the number 1 is initially wri

递推与递归专题练习

CH0301 递归实现指数型枚举 搜索与回溯,指数级算法. #include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){ rg T data=0,w=1; rg char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') w=-1; ch=getchar(); } while(isdi

HDU 2049 不容易系列之(4)——考新郎 (递推,含Cmn公式)

不容易系列之(4)——考新郎 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 26788    Accepted Submission(s): 9813 Problem Description 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是

算法--递推策略

本文地址:http://www.cnblogs.com/archimedes/p/4265019.html,转载请注明源地址. 递推法是一种重要的数学方法,在数学的各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法.这种算法特点是:一个问题的求解需一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,从问题出发逐步推到已知条件,此种方法叫逆推.无论顺推还是逆推,其关键是要找到递推式.这种处理问题的方法能使复杂

hdu 2050 折线分割平面 (递推)

折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15709    Accepted Submission(s): 10836 Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面

递推欧拉函数

/*=======================================================*\ | 递推求欧拉函数phi(i) 欧拉函数\varphi(n)是小于或等于n的正整数中与n互质的数的数目 \*=======================================================*/ #define N 3000000 __int64 phi[N + 100]; void Euler() { int i, j; for(i = 1; i

hdu 2563 递推

#include <stdio.h> #include <string> #include <iostream> #include <string.h> #include <map> #define MAX 30 using namespace std; /* 一道很好的递推题,虽然思路是从discuss中获得,但是应该想简单些,从前一次走可获得, 每次向上走可以为下一次获得3步机会,而向左或者向右则只能由两种. */ int main() {

HDU 2046 骨牌铺方格(递推)

骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 42774    Accepted Submission(s): 20735 Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: Inpu