1. 程式人生 > >B.找單詞——(HDU 2082 普通型母函式)

B.找單詞——(HDU 2082 普通型母函式)

傳送門

找單詞

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認為是同一個單詞)。
Input 輸入首先是一個整數N,代表測試例項的個數。
然後包括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;
}