1. 程式人生 > >遞推的復習(1)

遞推的復習(1)

scanf size 樓梯 splay agent lse ++ n-1 ont

實際上我只是貼我做的題而已
不僅如此,我還是一兩道題就給一篇博客

骨牌問題(yzoj1366)

Description

 有 2 行 N 列的長方形,可以用 N 個1*2 的骨牌鋪滿,但可能有很多種不同的鋪法。現在給出自然數n,請回答當長方形為 2 行 n 列時,有多少種不同的鋪設方法。
 

Input

第一行一個整數t表示測試數據組數。下面的t行,每行一個整數n。

Output

每組數據輸出一行一個整數,表示方案總數,這個數可能很大,所以只需輸出模10007後的結果。

Sample Input Sample Output
3 2 5 7 2 8 21

難得換行了,但是實際上答案是要求換行的

這一個比較的簡單,可以看出來就是斐波那契數列
所以直接打表法

Code

#include<bits/stdc++.h>
#define maxn 100003
#define Mod 10007
using namespace std;
int f[maxn];
int main(){
    f[1]=1;f[2]=2;
    for(int i=3;i<maxn;i++)f[i]=(f[i-1]+f[i-2])%Mod;
    int n;
    scanf("%d",&n);
    while(n--){
        int t;
        cin>>t;
        cout<<f[t]<<endl;
    }
    return 0;
}

爬樓梯(yzoj1367)

Description

何老師爬樓梯,他可以每步上 1 、2或3 級,輸入樓梯的級數,求不同的走法數。例如:樓梯一共有3級,他可以每步都走一級,或者第一步走一級,第二步走兩級,也可以第一步走兩級,第二步走一級,還有就是第一步就上3級,所以一共4種方法。

Input

第一行:N、K。  第二行:K個整數h[i],表示壞了的樓梯的級數(1<=h[i]<=N)。

Output

不同的走法數,這個數字可能很巨大,所以輸出最後答案mod 1234567

我懶得給樣例了,說實話我不喜歡抄題

分析

這個的話把壞掉的樓梯直接變成方案數0就可以了,註意邊界要特殊處理。方程的話經過推理事

\[ f[n]=f[n-1]+f[n-2]+f[n-3] \]

Code

#include<bits/stdc++.h>
#define Mod 1234567
#define maxi 1007
using namespace std;
int f[maxi];
bool is_broken[maxi];
int main(){
    memset(is_broken,0,sizeof(is_broken));
    memset(f,0,sizeof(f));
    int n,k;
    f[1]=1;f[2]=2;f[3]=4;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=k;i++){
        int x;
        scanf("%d",&x);
        is_broken[x]=true;
    }
    if(is_broken[1]){
        f[1]=0;f[2]-=1;f[3]-=2;
    }
    if(is_broken[2]){
        f[2]=0;
        if(is_broken[1]){
            f[3]-=1;
        }
        else f[3]-=2;
    }
    if(is_broken[3]){
        f[3]=0;
    }
    for(int i=4;i<=n;i++){
        if(is_broken[i])f[i]=0;
        else f[i]=(f[i-1]+f[i-2]+f[i-3])%Mod;
    }
    printf("%d",f[n]);
    return 0;
}

遞推的復習(1)