B.找單詞——(HDU 2082 普通型母函式)
阿新 • • 發佈:2019-01-28
找單詞
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5721 Accepted Submission(s): 4026
Problem Description 假設有x1個字母A, x2個字母B,..... x26個字母Z,同時假設字母A的價值為1,字母B的價值為2,..... 字母Z的價值為26。那麼,對於給定的字母,可以找到多少價值<=50的單詞呢?單詞的價值就是組成一個單詞的所有字母的價值之和,比如,單詞ACM的價值是1+3+14=18,單詞HDU的價值是8+4+21=33。(組成的單詞與排列順序無關,比如ACM與CMA認為是同一個單詞)。
然後包括N行資料,每行包括26個<=20的整數x1,x2,.....x26.
Output 對於每個測試例項,請輸出能找到的總價值<=50的單詞數,每個例項的輸出佔一行。 Sample Input 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 2 6 2 10 2 2 5 6 1 0 2 7 0 2 2 7 5 10 6 10 2 10 6 1 9 Sample Output 7 379297
解題思路:
這是一個母函式的題,因為ACM與CMA認為是同一個單詞,因為這是組合問題,所以這不是指數型的母函式。 在下一篇部落格中會詳細介紹一下關於普通型母函式的知識點。這裡就簡單的說幾句,就拿第一個例子來說吧,就拿第一個例子來說吧,我們可以這樣想因為A, B, C的字母只有一個而且他們的價值還不相同,A=1,B=2,C=3,所以我們可以組成的單詞可以是(1+X)
* (1+X^2) * (1+X^3) == 1 + X + X^2 + 2*X^3 + X^4 + X^5 + X^6,所以價值不 小於50的就是 <=50的 X 的係數加起來, But沒有X^0前面的係數不需要,因為沒有字母就不是單詞,想明白這個之後就是寫程式了, 請看我的程式碼:
My Code:
#include <iostream> using namespace std; int c1[55];///每一次存的多項式中的數 int c2[55];///中間轉化變數 int arr[30];///輸入的價值陣列 ///初始化 void Init() { for(int i=0; i<55; i++) { c1[i] = 0; c2[i] = 0; } } int main() { int n; cin>>n; while(n--) { Init(); for(int i=1; i<=26; i++) cin>>arr[i]; c1[0] = 1; for(int i=1; i<=26; i++)///一共26個多項式相乘 { for(int j=0; j<=50; j++)///指數最多是50 { for(int k=0; k<=arr[i] && k*i+j<=50; k++)///迴圈次數,k*i也是指數,就是多項式相乘 { c2[k*i+j] += c1[j]; } } for(int j=0; j<=50; j++)///c1才是係數 { c1[j] = c2[j]; c2[j] = 0; } } int ret = 0; for(int i=1; i<=50; i++)///指數是0的不算單詞 ret += c1[i]; cout<<ret<<endl; } return 0; }