小明被劫持到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 求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,總重量不超過揹包可承受的最大重量,且價值總和最大。輸出最大價...