有趣演算法之 2 4 排列問題

2021-10-09 19:41:17 字數 1110 閱讀 8056

太久沒更新了,冒個泡,證明一下存在啦!

設r=是要進行配列的n的元素,ri=r-。集合x中的元素的全排列記為perm(x)。(ri)perm(x)表示在全排列perm(x)的每乙個排列前加上字首ri得到的排列。r的全排列可歸納的定義如下:

遞迴過程:

將規模為 n 的全排列問題轉化為規模為 n − 1的全排列問題。故全排列可以看做固定 [ 0 , k ] 位,對 [ k + 1 , n ] 位進行全排列,當 k + 1 = n 時,遞迴結束。

第 k 層的迴圈是第 k 位與它自身及後面的非重複元素交換,然後對前 k 位進行固定,進入 k + 1 層的迴圈。

根據上面的,我自己畫了一張**解釋的相關,各位大佬湊合著看吧!

假設遞迴演算法所需的計算時間為 t(n),則:

解得:t(n)=o(n!)

#include using namespace std;

#define length 3

template//宣告乙個模板,虛擬型別名為t

inline void swap(t &a,t &b)

templatevoid perm(t list,int k,int m)// 產生list[k:m]的所有排列

count++;

cout<

}for(int i=k;i<=m;i++)

swap(list[k],list[i]);

permexcludesame(list,k+1,m);

swap(list[k],list[i]);

}}int main()

; //不帶重複元素

perm(list,0,length-1);

char list[length]=; //帶重複元素

permexcludesame(list,0,length-1);

return 0;

}

hdu 4248排列問題

一看就可以用母函式做,不過好久沒練dp了,所以還是用dp做了。用dp i j 表示前i種石頭排出j個出來的種數,當考慮第i種石頭石,列舉其使用的個數即可。wa了好幾次,是整數相乘精度的問題,使用long long就過了。hdu1004 win.cpp created on 2012 7 24 aut...

下一排列問題(全排列暴力)

time limit 1000 ms memory limit 32768 kb description lele 最近上課的時候都很無聊,所以他發明了乙個數字遊戲來打發時間。這個遊戲是這樣的,首先,他拿出幾張紙片,分別寫上0到9之間的任意數字 可重複寫某個數字 然後,他叫同學隨便寫兩個數字x和k。...

2 6 排列的字典序問題

問題描述 n 個元素有 n 個不同的排列。將這 n 個排列按字典序排列,並編號為 0,1,n 1。每個排列的編號為其字典序值。例如,當 n 3 時,6 個不同排列的字典序值如下 字典序值 0 1 2 3 4 5 排列 123 132 213 231 312 321 程式設計任務 給定 n 以及 n ...