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

  • User Avatar
    shinhj88

    [[MALGOSPOT]]
    문제를 풀다가 도저히 다른 방법이 생각나지 않아 질문올립니다.
    저는 이문제를 비트마스크의 서브셋을 이용하여
    남은 DT[남은 문제수][이미처리된 제출들]을 구하였습니다.
    처음에는 배열로 잡으니깐 메모리초과가나서 map을 이용하여 구현 하였더니 시간초과가 나옵니다.
    MAP을 이용하더라도 체크하는 배열을만들어 MAP에서 값을 탐색하는 시간을 줄여보려고 시도하였는데 잘안됩니다 ㅜㅜ
    고수님들... 도와주세요 ㅜㅜ
    ~~~ c++
    #include
    #include
    #include
    #include
    using namespace std;
    const int MOD = 1000000009;
    bool check[21][(1<< 20)];
    map 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));

        }
    

    }


    11년 전
3개의 댓글이 있습니다.
  • User Avatar
    veckal

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


    11년 전 link
  • User Avatar
    shinhj88

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


    11년 전 link
  • User Avatar
    shinhj88

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


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