设为首页 加入收藏

TOP

ZOJ 3329 One Person Game 带环的概率DP
2015-07-20 17:34:10 来源: 作者: 【 】 浏览:1
Tags:ZOJ 3329 One Person Game 概率

每次都和e[0]有关系 通过方程消去环

dp[i] = sigma(dp[i+k]*p)+dp[0]*p+1
dp[i] = a[i]*dp[0]+b[i]
dp[i] = sigma(p*(a[i+k]*dp[0]+b[i+k]))+dp[0]*p+1
a[i] = sigma(a[i+k]*p)+p
b[i] = sigma(b[i+k]*p)+1

#include 
  
   
#include 
   
     using namespace std; double A[555], B[555], P[555]; //dp[i] = sigma(dp[i+k]*p)+dp[0]*p+1 //dp[i] = a[i]*dp[0]+b[i] //dp[i] = sigma(p*(a[i+k]*dp[0]+b[i+k]))+dp[0]*p+1 //a[i] = sigma(a[i+k]*p)+p //b[i] = sigma(b[i+k]*p)+1 int main() { int T; scanf("%d", &T); while(T--) { int n, k1, k2, k3, a, b, c; scanf("%d %d %d %d %d %d %d", &n, &k1, &k2, &k3, &a, &b, &c); memset(A, 0, sizeof(A)); memset(B, 0, sizeof(B)); memset(P, 0, sizeof(P)); double p = 1.0/(k1*k2*k3); 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] += p; for(int i = n; i >= 0; i--) { A[i] = p; B[i] = 1; for(int j = 1; j <= k1+k2+k3; j++) { A[i] += A[i+j]*P[j]; B[i] += B[i+j]*P[j]; } } printf("%.18lf\n", B[0]/(1-A[0])); } return 0; }
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇atitit.组件化事件化的编程模型--.. 下一篇BZOJ 1040 ZJOI2008 骑士 树形DP

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)