HDU 1267 下沙的沙子有幾粒?

下沙的沙子有幾粒?

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4527    Accepted Submission(s): 2392


Problem Description
2005年11月份,我們學校參加了ACM/ICPC 亞洲賽區成都站的比賽,在這裏,我們獲得了歷史性的突破,儘管只是一枚銅牌,但獲獎那一刻的激動,也許將永遠銘刻在我們幾個人的心頭。藉此機會,特向去年爲參加ACM亞洲賽而艱苦集訓了近半年的各位老隊員表示感謝。
實際上,除了獲獎以外,在這次比賽期間還有一件事也讓我們記憶深刻。那是比賽當天等待入場的時候,聽到某個學校的一個隊員在說:“有個學校的英文名很有意思,叫什麼Hangzhou Dianzi University”. 哈哈,看來我們學校的英文名起的非常好,非常吸引人呀。
不過,事情的發展誰也沒有料到,隨着杭電英文校名的這一次曝光,影響越來越大,很多人開始對杭電英文校名進行研究,不久以後甚至還成立了一個專門的研究機構,叫做“HDU 校名研究會”。並不斷有報道說-相-當-多的知名科學家改行,專門對該問題進行研究,學術界稱之爲“杭電現象”。很多人在國際知名期刊上發表了研究論文,這其中,尤以中國超級女科學家宇春小姐寫的一篇研究報告最爲著名,報告發表在science上,標題是“杭電爲什麼這樣紅?” 文中研究發現:Hangzhou Dianzi University這個校名具有深刻的哲學思想和內涵,她同時提出了一個大膽的猜想:“假定一個字符串由m個H和n個D組成,從左到右掃描該串,如果字符H的累計數總是不小於字符D的累計數,那麼,滿足條件的字符串總數就恰好和下沙的沙粒一樣多。”
這就是當今著名的“宇春猜想”!
雖然還沒能從數學上證明這個猜想的正確性,但據說美國方面在小布什的親自幹預下,已經用超級計算機驗證了在(1<=n<=m<=1000000000000)時都是正確的。my god! 這是一個多麼偉大的猜想!雖然我們以前總說,21世紀是屬於中國的,可還是沒想這一天來的這麼早,自豪ing... + 感動ing...
感動和自豪之餘,問題也來了,如果已知m和n的值,請計算下沙的沙粒到底有多少。

Ps: 
1. 中國有關方面正在積極行動,着手爲宇春小姐申報諾貝爾獎。
2、“宇春猜想”中提到的H和D組成的字符串現在被學術界成爲“杭電串串”(“杭電串串”前不久被一個賣羊肉串的註冊了商標,現在我校正在積極聯繫買斷,據說賣方的底價是1000萬歐元,絕不打折,看來希望不大,sigh...)
 

Input
輸入數據包含多個測試實例,每個佔一行,由兩個整數m和n組成,m和 n 分別表示字符串中H和D的個數。由於我們目前所使用的微機和老美的超級計算機沒法比,所以題目給定的數據範圍是(1<=n<=m<=20)。
 

Output
對於每個測試實例,請輸出下沙的沙粒到底有多少,計算規則請參考“宇春猜想”,每個實例的輸出佔一行。
 

Sample Input
1 1 3 1
 

Sample Output
1 3
 


解題思路:
本題題目特別長。。。。。。需要精簡一下~
要求下沙的沙粒有多少個,則就是求滿足條件的字符串總數,也就是求滿足“字符H的累計數總是不小於字符D的累計數”的方法數。
設f(m,n)爲由m個H和n個D組成的字符串的總數,那麼很明顯滿足以下關係:
f(m,n)=f(m,n-1)+f(m-1,n),且當m<=n的時候,f(m,n)=0,當n=0的時候,f(m,n)=1。
這樣就找到了遞推關係。
有因爲範圍較小,因此不需考慮大數運算,所以問題得到解決。

代碼:
#include<iostream>
using namespace std;
#define maxn 110
long long a[maxn][maxn];//a[m][n],即m個人手持50 dollars,n個人手持100 dollars
void opera(){
    for(int i=0;i<maxn;i++){
        a[i][0]=1;
    }
    for(int i=1;i<maxn;i++){
        for(int j=1;j<=i;j++)
            a[i][j]=a[i-1][j]+a[i][j-1];
    }
}
int kase;
int m,n;
int main(){
    kase=0;
    opera();
    while(cin>>m>>n){
        if(m==0&&n==0)
            break;
       // cout<<"Test #"<<++kase<<":"<<endl;
        cout<<a[m][n]<<endl;
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章