1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include<stdio.h> int N, M, S, E, n[17][17], dp[17][65536], bit[17], trace[17][65536]; int min(int a, int b){ if (a > b)return b; return a; } int main(){ int i, j, k, maxx = 0, temp, h, sol = 99999999; scanf("%d", &N); for (i = 1; i <= N; i++){ maxx += bit[i] = 1 << i - 1; for (j = 1; j <= N; j++){ scanf("%d", &n[i][j]); } } for (i = 0; i <= maxx; i++){ for (j = 0; j <= N; j++){ dp[j][i] = 999999999; } } for (j = 1; j <= N; j++){ dp[j][bit[j]] = 0; trace[j][bit[j]] = j; } for (i = 1; i <= maxx; i++){ temp = i; for (k = N; k >= 1; k--){ if (temp - bit[k] < 0)continue; temp -= bit[k]; for (h = 1; h <= N; h++){ if (n[h][k] == 0)continue; if (dp[k][i] > dp[h][i - bit[k]] + n[h][k]){ dp[k][i] = dp[h][i - bit[k]] + n[h][k]; trace[k][i] = trace[h][i - bit[k]]; } } } } for (j = 1; j <= N; j++){ dp[j][maxx] += n[j][trace[j][maxx]]; sol = min(dp[j][maxx], sol); } i = 1; printf("%d", sol); return 0; } | cs |
비트마스킹 개념만 알고 있어서 이렇게 짯는데 다른 사람보다 10배 정도 느린거 같음
내가 짠 부분중 속도를 엄청 저하시키는 부분이 어디임?
한걸음더천천히간다해도그리늦는거는아냐
3중포문에서 겁나 걸리나보네
시간복잡도는 다른애들이랑 같으니 코딩최적화를 해야겠는데
bit[k] 대신 (1<<(k-1)) 쓰셈 사실 모든 인덱스를 0~N-1까지 쓰면 (1<<k)로 쓸수있을텐데 더 빨라질수도 있고 뭐 아님 말고
x + (1<<y) 꼴의 계산은 어셈 인스트럭션 하나라고 알고있음 bit[k]는 메모리참조를 해야하니 좀더 느릴테고
내 분야가 아니기때문에 좆문가질은 여기까지입니다
재귀함수 메모이제이션을 짜면 절대 답이 될 수 없는 state는 탐색 안하니까 더 빠를수도 있겠다
그 부분바꿔봐야겠다 땡큐ㅋㅋ - dc App