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;
}

좋은 웹페이지 즐겨찾기