牌型種數問題 二維動態規劃解決(附DFS)

2021-10-03 16:53:03 字數 1473 閱讀 8404

小明被劫持到x賭城,被迫與其他3人玩牌。  

一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。  

這時,小明腦子裡突然冒出乙個問題:  

如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?

請填寫該整數,不要填寫任何多餘的內容或說明文字。

注:該題是藍橋杯2015初賽第7題,為填空題。

要求組合的種數,我們首先要清楚撲克牌在題目中的特點:

不計花色,只計點數。

乙個點數的可能有五種,即有0,1,2,3,4五種可能。

總共拿到手的牌有13張。

於是我們的暴力列舉法就誕生了,方法就是13個for迴圈,每個迴圈都從0到4,最內層的條件是所有牌的總數為13。

這個耗時似乎有點長,在我的電腦上大概耗時3秒。

當然,這個肯定不是這個問題的最好解決辦法,我發現,用動態規劃可以巧妙的解決這個問題。

動態規劃(dynamic programming)這個簡介就不說了,說白了就是,在有一定初始條件的情況下,根據一些遞推的關係式,不斷的往前或者往後推導,最後得到想要的答案。

運用動態規劃,需要滿足兩個條件:

有一定的初始條件。能找到合適的遞推關係式。

首先,我們應該確定的是採用何種結構去把這個問題表示清楚。

13張牌,拿到每一張牌後,手中的手牌數有13種可能,我們可以用二維陣列表示出這個關係:

dp[i][j]表示拿到第 i 張牌,此時手中有 j 張牌的可能組合數。

尋找初始條件:很明顯,初始條件就是,拿到第一張牌的時候,手中最多有4張牌,組合是都是1。

也就是dp[1][0]=dp[1][1]=dp[1][2]=dp[1][3]=dp[1][4]=0。

遞推條件就是,根據手中牌的數目,加上之前相同手牌數的可能組合數,然後加上'''加上這張牌能夠對前一次手牌的解數產生影響的解數'''。

最終的答案就是dp[13][13]的值。

#includeint main()

} for (i = 0; i <= 4; i++)//動態規劃的初始條件

for (i = 2; i <= 13; i++)}}

}} }

printf("%ld", dp[13][13]);//最終解

}

答案是:3598180

深度優先搜尋的解法如下:

#includeint ans = 0, sum = 0;

void dfs(int cur)//cur為手中牌數

else

}}int main()

演算法篇 二維動態規劃問題

題目 給定乙個nxm的矩陣a和乙個整數k,小hi希望你能求出其中最大 元素數目最多 的子矩陣,並且該子矩陣中所有元素的和不超過k。input 第一行包含三個整數n m和k。以下n行每行包含m個整數,表示a。對於40 的資料,1 n,m 10 對於100 的資料,1 n,m 250 1 k 21474...

二維陣列 動態規劃

簡要描述 給定乙個m行n列的矩陣 m n個格仔 每個格仔中放著一定數量的平安果。你從左上角的各自開始,只能向下或者向右走,目的地是右下角的格仔。每走過乙個格仔,就把格仔上的平安果都收集起來。求你最多能收集到多少平安果。注意 當經過乙個格仔時,需要一次性把格仔裡的平安果都拿走。1 n,m 50 每個格...

二維費用的揹包問題(動態規劃)

二維費用的揹包問題 有 n n 件物品和乙個容量是 v v 的揹包,揹包能承受的最大重量是 m m 每件物品只能用一次。體積是 v i vi 重量是 m i mi 價值是 w i wi 求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,總重量不超過揹包可承受的最大重量,且價值總和最大。輸出最大價...