2015 멀티 스쿨 리그-HDU5389(dp)

1966 단어 dpHDU2015 리그
Sample Input

   
   
   
   
4 3 9 1 1 2 6 3 9 1 2 3 3 5 2 3 1 1 1 1 1 9 9 9 1 2 3 4 5 6 7 8 9

 
Sample Output

   
   
   
   
1 0 10 60

제목:
이미 두 개의 문이 있는데, 사람을 두 조로 나누도록 요구하는데, 두 조의 '와' 는 각각 두 개의 문의 숫자와 같으니, 당연히 모두 한 문으로 들어갈 수도 있다
아이디어: (NeverMoreH)
만약에 문제의 뜻을 충족시키는 해를 찾을 수 있다면 반드시 a와 b의 합과 n개인의 표호와 같은 합을 만족시킬 것이다. 그래서 우리는 n개인의 표호가 a를 구성하는 상황이 얼마나 되는지(또는 b만 판단하거나 똑같음)만 판단할 수 있고 n사람을 모두 a에게 나누거나 b에게 나누는 것도 만족할 수 있다는 것을 주의해야 한다.(역시 경험이 부족해--, 방법을 생각하지 못했다)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define N 500010
#define mod 258280327

int q[100050];
int dp[100005][10];

int Sum(int x,int y)
{
    int temp = x + y;
    int ans = temp % 9;
    if(ans == 0)
        return 9;
    return ans;
}

int main()
{
    int T,n,a,b;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&a,&b);
        int sum = 0;
        for(int i = 1; i <= n ; i++)
        {
            scanf("%d",&q[i]);
            sum = Sum(sum,q[i]);
        }
        memset(dp,0,sizeof(dp));
        dp[0][0] = 1;

        for(int i = 1; i <= n; i++)
            for(int j = 0; j <= 9; j++)
            {
                dp[i][j]+=dp[i-1][j];
                dp[i][Sum(j,q[i])] +=dp[i-1][j];
                dp[i][j] %= mod;
                dp[i][Sum(j,q[i])] %= mod;
            }
        int ans = 0;

        ans = (ans+dp[n][a]) * (Sum(a,b) == sum);

        if(sum == a && ans == 0)
            ans++;
        if(sum == b)
            ans++;
        printf("%d
",ans); } return 0; }

좋은 웹페이지 즐겨찾기