말고스팟 문제좀 도와주세요 ㅜㅜ

  • shinhj88
    shinhj88

    MALGOSPOT
    문제를 풀다가 도저히 다른 방법이 생각나지 않아 질문올립니다.
    저는 이문제를 비트마스크의 서브셋을 이용하여
    남은 DT[남은 문제수][이미처리된 제출들]을 구하였습니다.
    처음에는 배열로 잡으니깐 메모리초과가나서 map을 이용하여 구현 하였더니 시간초과가 나옵니다.
    MAP을 이용하더라도 체크하는 배열을만들어 MAP에서 값을 탐색하는 시간을 줄여보려고 시도하였는데 잘안됩니다 ㅜㅜ
    고수님들... 도와주세요 ㅜㅜ

    #include <cstdio>
    #include <memory.h>
    #include <map>
    #include <algorithm>
    using namespace std;
    const int MOD = 1000000009;
    bool check[21][(1<< 20)];
    map<int,int> DT[21];
    int dbit[21];
    int n,m;
    int memo(int submit,int accept,int discard)
    {
            if(accept == 0)return 1;
            if(check[submit][accept])return DT[submit][accept];
            int d = 0;
            check[submit][accept] = true;
            for(int i = 0; i < m; i++)
            {
                    if(accept & (1 << i))
                    {
                            int t = __builtin_popcount(discard | dbit[i]) - (n - submit);
                            if(submit / 2 >= t)
                            {
                                    d += memo(submit - t,accept & ~(1 << i), (discard | dbit[i])) % MOD; 
                            }
    
                    }
            }
            return DT[submit][accept] = d;
    }
    int main()
    {
            int T;
            scanf("%d",&T);
            while(T--)
            {
                    scanf("%d%d",&n,&m);
                    memset(check,false,sizeof(check));
                    for(int i = 0;i <= n; i++)DT[i].clear();
                    for(int i = 0; i < m;i++)
                    {
                            int a,t;
                            scanf("%d",&t);
                            dbit[i] = 0;
                            for(int j = 0;j < t; j++)
                            {
                                    scanf("%d",&a);
                                    dbit[i] |= (1 << a);
                            }
                    }
                    printf("%d\n",memo(n,(1 << m) - 1,0));
    
            }
    
    }
    

    10년 전
3개의 댓글이 있습니다.
  • veckal
    veckal

    accept 안에 submit에 대한 정보가 포함되어 있습니다. 1<<20 크기의 배열로 충분해요


    10년 전 link
  • shinhj88
    shinhj88

    ㅜㅜ 1<<20 크기로 줄였는데 오답나와요 ㅜㅜ 제 풀이법은 맞기는 한거가요?????


    10년 전 link
  • shinhj88
    shinhj88

    아감사해요 long long int로 바꾸고 모드연산을 뒤에다 놓으니깐 되네요 ㅋㅋㅋㅋ


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.