動態規劃(二)——錯位重排

簡介

錯位重排問題是伯努利和歐拉在錯裝信封時發現的,是比較有意思的發現這兩傢伙是有多無聊。一般的全錯位排列問題研究這樣的問題:
1.給所有的容器和等量的物品標號。
2.將物品放到容器中,不允許容器放入自己標號的物品。
基於這樣模型的問題就是錯位重排問題。

模型的遞推公式推導

爲了coding方便,也根據DP的思想,我們設計遞推公式來解決這個問題,同樣地,我們使用F[n]來表示n個物品的錯排個數,下面我們可以分兩步進行重排的操作,這裏先貼一篇比較好的參考:錯排公式
題目傳送門:不容易系列
完全的重排模型。
上代碼:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
#define N 31
using namespace std;
long F[N];  //Êý¾Ý·¶Î§×¢Òâ
int main(){
    //freopen("test.txt","r",stdin);
    int n;
    memset(F,0,sizeof(F));
    F[0]=0;F[1]=0;F[2]=1;
    for(int i=3;i<N;i++){
        F[i]=(i-1)*(F[i-1]+F[i-2]);
    }
    while(scanf("%d",&n)!=EOF){
        printf("%ld\n",F[n]);
    }
    return 0;
}

本篇寫的有點匆忙,過後繼續補充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章