ZOJ 3329 One Person Game(概率dp 經典)
阿新 • • 發佈:2019-01-10
題目連結:https://vjudge.net/problem/ZOJ-3329
#include<cstdio> #include<cstring> #include<string> #include<cctype> #include<iostream> #include<set> #include<map> #include<cmath> #include<sstream> #include<vector> #include<stack> #include<queue> #include<algorithm> #define fin freopen("a.txt","r",stdin) #define fout freopen("a.txt","w",stdout) typedef long long LL; using namespace std; typedef pair<int, int> P; const int INF = 1e8 + 10; const int maxn = 1000 + 10; double A[maxn], B[maxn], p[maxn], p0; int n, k1, k2, k3, a, b, c; int main() { //fin; int T; scanf("%d", &T); while(T--) { cin >> n >> k1 >> k2 >> k3 >> a >> b >> c; p0 = 1.0/(k1*k2*k3); memset(p, 0, sizeof p); memset(A, 0, sizeof A); memset(B, 0, sizeof B); for(int i = 1; i <= k1; i++) for(int j = 1; j <= k2; j++) for(int k = 1; k <= k3; k++) if(i != a || j != b || k != c) p[i+j+k] += p0; for(int i = n; i >= 0; i--) { A[i] = p0; B[i] = 1.0; for(int k = 3; k + i <= n; k++) { A[i] += p[k]*A[i+k]; B[i] += p[k]*B[i+k]; } } printf("%.12f\n", B[0]/(1.0-A[0])); } return 0; }