(演算法)金釵賽詩

2021-09-07 00:27:39 字數 952 閱讀 2334

賽詩會後,十二金釵待奔前程。分別宴上,12人各寫了一首詩放入包囊。

大家隨機取乙個,若取到自己的詩,則再取乙個,並放回自己的詩,12人都拿到詩算一種分配。

請問:共有多少種不同的分配?

問題簡化:給定n個人寫n首詩,要求贈給其他人,共有多少種分配方法。

通俗一點就是:1到n的全排列,第i個數不是i的排列共有多少種?

其實這就是「錯位排列」。

這裡簡單從類似動態規劃的角度來分析問題:

假設n個數的錯位排列數目為dp[n]

第n個數可以放置在1...(n-1)之間的任何乙個位置,共(n-1)種方法;

假設第n個數放在了第k個位置,那麼對於數字k而言:

如果放在了第n個位置,那麼相當於n和k做了交換,剩下的就是其他(n-2)個數的錯位排列了,即dp[n-2];

如果不放在第n個位置,那麼剩餘(n-1)個數(可以將此時k看出原來的n,即此時剩下除了k位置外的所有數),即dp[n-1];

因此動態規劃的狀態轉移方程為:

dp[n]=(n-1)*(dp[n-1]+dp[n-2]);

初始狀態:

當n=1;dp[1]=0;

當n=2;dp[2]=1;(兩個數,只存在一種錯排的可能)

通過上述公式的遞推可以得到「錯排公式」:

d(n) = n! [1/0! - 1/1! + 1/2! - 1/3! + 1/4! + ... + (-1)^n/n!].

#include using namespace std;

int miscombination_1(int n)

int miscombination_2(int n)

return third;

}int main()

問題答案:

2019世界桌球錦標賽女單劉詩雯奪冠

賽後她說 自從19歲拿了世界盃冠軍之後,我對世錦賽的單打冠軍太渴望了。兩次決賽失之交臂,我一度認為自己很難做到,有過放棄的想法。我值得這個冠軍,只是他來得晚了一點。after winning the world cup at the age of 19,i was so hungry for the...

演算法設計 迴圈賽

sun 書 計算機演算法設計與分析 q 設有n 2 k個運動員要進行網球迴圈賽。現要設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其他n 1個選手各賽一次 2 每個選手一天只能參賽一次 3 迴圈賽在n 1天內結束。按此要求將比賽日程表設計成有n行和n 1列的乙個表。在表中的第i行,第j列處填入...

演算法作業 迴圈賽問題 分治演算法

題目 設有 n個運動員要進行網球迴圈賽,設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其他 n 1個選手各賽一次 2 每個選手一天只能賽一次 3 當n 是偶數,迴圈賽進行 n 1天,當 n是奇數,迴圈賽進行n天。思路分析 如果 n是奇數,其實就等於 n 1種情況下將第 n 1號選手輪空。所以只...