반응형
어떻게 풀까?
문제를 살펴봅시다!
days일에 a 마을에 있을 확률을 라고 하고, a 마을에서 b 마을로 이동할 확률을라고 한다면,
임을 알 수 있습니다.
따라서, 위 식을 이용해서 P[days][n]의 배열을 만들고,
시작 마을이 p이기 때문에
P[0][p]을 1로 초기화 한 다음에 day와 마을 수 n만큼 반복해주면 간단하게 답을 구할 수 있습니다!
코드
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #pragma once #include<cstdio> #include<cstring> int adj[50][50]; int n, p; int deg[50]; double adj2[50][50]; double memoi[101][50]; double dp[101][50]; int main() { int c; scanf("%d\n", &c); while (c--) { int d; scanf("%d %d %d\n", &n, &d, &p); memset(deg, 0, sizeof(deg)); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d \n", &adj[i][j]); deg[i] += adj[i][j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { adj2[i][j] = (double)adj[i][j] / deg[i]; } } memset(dp, 0, sizeof(dp)); dp[0][p] = 1; for (int days = 0; days < d; days++) { for (int i = 0; i < n; i++) { if (dp[days][i] != 0) { for (int j = 0; j < n; j++) { dp[days + 1][j] += dp[days][i] * adj2[i][j]; } } } } int t; scanf("%d\n", &t); while(t--) { int q; scanf("%d \n", &q); printf("%.10lf ", dp[d][q]); } printf("\n"); } return 0; } | cs |
여담
오늘도.. deg 배열을 초기화 하지 않아서 정답을 제대로 맞추지 못했었습니다.
초기화 하는 부분을 찾는데 꽤 많은 시간을 소모했습니다.
항상 초기화 잘하고, 문제를 잘 읽는 것을 잊지 맙시다!
그리고 유효 숫자가 소숫점 7 자리 까지라고 나와있습니다.
보통 float는 유효 숫자가 6~7 자리까지이기 때문에, 이처럼 유효 자리 숫자가 있는 경우에는 double을 사용하여 풀도록 합시다!
나중에 이러한 소소한 팁도 올리겠습니다!
반응형
'공부 > 알고리즘 문제풀이' 카테고리의 다른 글
[알고스팟] 광학 문자 인식 (0) | 2018.06.18 |
---|---|
[알고스팟] 여행 짐 싸기 (2) | 2018.06.17 |
[알고스팟] 폴리오미노 (0) | 2018.06.17 |
[알고스팟] 비대칭 타일링 (0) | 2018.06.16 |
[알고스팟] 삼각형 위의 최대 경로 개수 세기 (0) | 2018.06.16 |