題目鏈結
hdu_1627_下沙的沙子有幾粒
problem description:input
輸入資料報含多個測試例項,每個佔一行,由兩個整數m和n組成,m和 n 分別表示字串中h和d的個數。由於我們目前所使用的微機和老美的超級計算機沒法比,所以題目給定的資料範圍是(1<=n<=m<=20)。
output
對於每個測試例項,請輸出下沙的沙粒到底有多少,計算規則請參考「宇春猜想」,每個例項的輸出佔一行。
sample input
1 1
3 1sample output1 3
分析:
我做這道題,開始是用遞迴做的,類似 dfs 列舉了每個狀態先放 h 還是先放 d ,在測試數字在15以內的時候就可以很快得出答案,但再大就 t 了,想想也是在情理之中,他的狀態數是成指數上公升的。因此我就用遞迴對 10 以內的資料打了個表,發現了乙個遞推關係,
a[m][n] = a[m-1][n] + a[m][n-1],所以我是在完全不理解這個關係的情況下ac的 =_=! ….
現在來分析下這個式子,對於一組 m,n,a[m][n] 表示m個 h ,n個 d 滿足條件的放法,那麼怎樣從前一種狀態轉移過來呢,因為對於每種情況我們可以確定最後乙個位置放得不是 h 就是 d ,所以就可以抓住這一點來轉移了:
對於 一組m,n:
1.固定最後乙個位置放 h ,那麼前面的放法就是 a[m-1][n] 了,應該很容易理解。
2.固定最後乙個位置放 d ,則前面放法就是 a[m][n-1] 了。
由於只有這兩種互不重疊的情況,所以就有了以上的遞推公式了,最後有沒有發現和高中組合數里的乙個公式很像,c(m,n)=c(m-1,n-1)+c(m-1,n) ,貌似可以借助這個公式理解一下。
下面就見**君咯~
#include
#include
using
namespace
std;
long
long a[21][21];
int main()
}int m,n;
while(cin>>m>>n)
HDU 下沙的沙子有幾粒?(遞推)
寫一下自己的思路歷程。1.模擬leetcode的括號匹配,採用dfs 當h的數目大於d的數目且d的數目小於n時,在字串尾增加乙個d 當h的數目小於m時,在子串增加乙個h 結束搜尋的條件是d的數目等於n且h的數目等於m,結束時檢查得到字串是不是符合要求,如果是則ans 最後輸出ans 結果是交上去血t...
下沙的沙子有幾粒
input 輸入資料報含多個測試例項,每個佔一行,由兩個整數m和n組成,m和 n 分別表示字串中h和d的個數。由於我們目前所使用的微機和老美的超級計算機沒法比,所以題目給定的資料範圍是 1 n m 20 output 對於每個測試例項,請輸出下沙的沙粒到底有多少,計算規則請參考 宇春猜想 每個例項的...
ACM HDOJ 下沙的沙子有幾粒?
problem description 2005年11月份,我們學校參加了acm icpc 亞洲賽區成都站的比賽,在這裡,我們獲得了歷史性的突破,儘管只是一枚銅牌,但獲獎那一刻的激動,也許將永遠銘刻在我們幾個人的心頭。藉此機會,特向去年為參加acm亞洲賽而艱苦集訓了近半年的各位老隊員表示感謝。實際上...