題目描述:
n個人排名,允許並列名次,共有多少種排名結果?(1 <= n < 19)示例:
n = 1時,結果為1,只有一種排名結果。
n = 2時,結果為3,即 a = b, a > b, b > a 三種情況。
n = 3時,結果為13,下面列舉:題目分析:a = b = c
a > b > c
a > b = c
a > c > b
a = b > c
a = c > b
b > a > c
b > a = c
b > c > a
c > a > b
c > a = b
c > b > a
c = b > a
本題可以採用遞迴的解法,基於遞迴的思想可改為動態規劃的方法。
下面分析一下本題採用的遞推思路。
我們從上面的 n=3 時的舉例分析,可以看出,3個人就有1~3共3種名次,那麼只有1種名次便是3個人名次都相同的情況,2種名次就是有兩個人名次相同的情況,3種名次就是3個人名次都不相同的情況(即 n!n!
n!種情況)。
那麼接下來,假設有 n
nn 個人,排出 m
mm 個名次( 注意m
mm在這裡是固定的 ),有 f(n
,m)f(n, m)
f(n,m)
種結果(
1<=m
<=n
)(1 <= m <= n)
(1<=m
<=n
):當 m
mm 為 1
11 時,f(n
,m)=
1f(n ,m) = 1
f(n,m)=1;
當 1
<
m<=n
1 < m <= n
1<
m<=n
時,對於新加入的1個人與前面 n−1
n - 1
n−1 個人的名次關係存在兩種情況:
①新加入的人與前面 n−1
n - 1
n−1 個人存在並列排名關係,那麼前面 n−1
n - 1
n−1 個人便可排出 m
mm 個名次,而新加入的人有可能與這 m
mm 個名次中的任意乙個重複,因此這種情況便有f(n
−1,m
)∗mf(n - 1, m) * m
f(n−1,
m)∗m
種結果。
②新加入的人與前面 m−1
m-1m−
1 個人都不並列,那麼前面 n−1
n-1n−
1 個人便可排出 m−1
m-1m−
1 個名次,那麼新加入的人可能是 m
mm 個名次中任意乙個,這樣便可和前面 n−1
n - 1
n−1 個人構成 m
mm 個名次了,因此這種情況便有f(n
−1,m
−1)∗
mf(n - 1, m - 1)* m
f(n−1,
m−1)
∗m種結果.。
那麼綜合上述兩種情況,f(n
,m)=
m∗(f
(n−1
,m)+
f(n−
1,m−
1))f(n, m) = m * (f(n - 1, m) + f(n - 1, m - 1))
f(n,m)
=m∗(
f(n−
1,m)
+f(n
−1,m
−1))
我們接下來做以實現:
/* 返回值是long long 型別,因為 n大於12時會溢位 */
long
long
orderfun
(int n,
int m)
long
long
orderfun
(int n)
return res;
}int
main()
}
上面我們使用了遞迴的解法,因此我們是可以修改為動態規劃解法的,使用動態規劃,我們不會產生大量的函式呼叫開銷,一次呼叫,便可計算出結果。
我們可以根據上面的遞迴函式得出dp陣列的含義,首先是乙個二維陣列。dp[
i][j
]dp[i][j]
dp[i][
j]表示 i
ii 個人,j
jj 種排名所對應的排名結果。
那麼狀態轉移方程就為
d p[
i][j
]=1&& \\ j *(dp[i-1][j]+dp[i-1][j-1]) && }}
/* 累加n個人j種排名的所有結果,得到最終結果 */
網易筆試程式設計 數字遊戲
小易邀請你玩乙個數字遊戲,小易給你一系列的整數。你們倆使用這些整數玩遊戲。每次小易會任意說乙個數字出來,然後你需要從這一系列數字中選取一部分出來讓它們的和等於小易所說的數字。例如 如果是你有的一系列數,小易說的數字是11.你可以得到方案2 2 7 11.如果頑皮的小易想坑你,他說的數字是6,那麼你沒...
上機筆試程式設計訓練 揹包問題
王強今天很開心,公司發給n元的年終獎。王強決定把年終獎用於購物,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子 主件 附件電腦 印表機,掃瞄器 書櫃圖書 書桌檯燈,文具 工作椅無 如果要買歸類為附件的物品,必須先買該附件所屬的主件。每個主件可以有 0 個 1...
極致遊戲21屆校招遊戲開發筆試程式設計題
昨天有幸參加了極致遊戲的筆試,題目分為了30道選擇題 60分 和2道程式設計題 40分 都只有一次進入作答的機會。兩道程式設計題趁還有映像趕緊記錄一下。題目描述 輸入是一串全部由左括號和右括號組成且保證括號配對的字串。例如 現有一些計算規則如下 值為1 ab 值為a b ab 值為2 a b 根據上...