簡介
錯位重排問題是伯努利和歐拉在錯裝信封時發現的,是比較有意思的發現這兩傢伙是有多無聊。一般的全錯位排列問題研究這樣的問題:
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;
}
本篇寫的有點匆忙,過後繼續補充。