문제 정의
축구 팀 A와 B가 90분에 걸쳐 경기를 한다. 적어도 한 팀이 골을 소수로 득점할 확률을 구하라.
경기를 5분 간격으로 나누고, 처음 간격은 처음 5분이다.
A팀과 B팀이 이 간격에서 득점할 확률이 주어질 때, 경기가 끝난 후 적어도 한 팀이 골을 소수로 득점할 확률을 구하시오.
입력 예) 50 50
문제 풀이
이 문제는 DP로 풀 수 있습니다.
DP[p][a][b] : p번째 간격이 지났을 때, A팀이 a골, B팀이 b골을 넣었을 확률
즉, pa를 A가 넣을 확률, pb를 B가 넣을 확률이라고 할 때,
DP[p][a][b] = DP[p-1][a][b] * (1.0 - pa) * (1.0 - pb) +
DP[p-1][a-1][b] * pa * (1.0 - pb) +
DP[p-1][a][b-1] * (1.0-pa) * pb +
DP[p-1][a-1][b-1] * pa * pb
로 구할 수 있습니다.
소스코드
#include< stdio.h > double dp[20][20][20]; int prime[7] = { 2,3,5,7,11,13,17 }; int isprime(int x) { for (int i = 0; i < 7; i++) if (x == prime[i]) return 1; return 0; } int main() { int a, b; scanf("%d%d", &a, &b); double A = a / 100.0, B = b / 100.0; dp[1][0][0] = (1. - A) * (1. - B); dp[1][1][0] = A * (1. - B); dp[1][0][1] = (1. - A) * B; dp[1][1][1] = A*B; for (int p = 2; p <= 18; p++) { for (a = 0; a <= 18; a++) { for (b = 0; b <= 18; b++) { dp[p][a][b] = dp[p - 1][a][b] * (1. - A)*(1. - B); if (a != 0) dp[p][a][b] += dp[p - 1][a - 1][b] * A * (1. - B); if (b != 0) dp[p][a][b] += dp[p - 1][a][b - 1] * (1. - A) * B; if (a != 0 && b != 0) dp[p][a][b] += dp[p - 1][a - 1][b - 1] * A * B; } } } double ans = .0; for(a=0;a<=18;a++){ for (b = 0; b <= 18;b++) { if (isprime(a) || isprime(b)) ans += dp[18][a][b]; } } printf("%.10lf\n", ans); return 0; }
'알고리즘 문제풀이' 카테고리의 다른 글
BOJ 1194 달이 차오른다, 가자. (0) | 2020.08.11 |
---|---|
BOJ 6087 레이저통신 (0) | 2020.08.09 |
BOJ 11505 구간 곱 구하기 (0) | 2020.08.06 |
1351 무한 수열 (0) | 2018.05.28 |
1670 정상 회담 2 (0) | 2018.05.17 |