말고스팟 문제좀 도와주세요 ㅜㅜ 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 accept 안에 submit에 대한 정보가 포함되어 있습니다. 1<<20 크기의 배열로 충분해요 10년 전 link shinhj88 ㅜㅜ 1<<20 크기로 줄였는데 오답나와요 ㅜㅜ 제 풀이법은 맞기는 한거가요????? 10년 전 link shinhj88 아감사해요 long long int로 바꾸고 모드연산을 뒤에다 놓으니깐 되네요 ㅋㅋㅋㅋ 10년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
shinhj88
MALGOSPOT
문제를 풀다가 도저히 다른 방법이 생각나지 않아 질문올립니다.
저는 이문제를 비트마스크의 서브셋을 이용하여
남은 DT[남은 문제수][이미처리된 제출들]을 구하였습니다.
처음에는 배열로 잡으니깐 메모리초과가나서 map을 이용하여 구현 하였더니 시간초과가 나옵니다.
MAP을 이용하더라도 체크하는 배열을만들어 MAP에서 값을 탐색하는 시간을 줄여보려고 시도하였는데 잘안됩니다 ㅜㅜ
고수님들... 도와주세요 ㅜㅜ
10년 전