ZOJ3329之经典概率DP
One Person Game
Time Limit: 1 Second Memory Limit: 32768 KB Special Judge
There is a very simple and interesting one-person game. You have 3 dice, namely Die1, Die2 and Die3. Die1 has K1 faces. Die2 has K2 faces. Die3 has K3 faces.
All the dice are fair dice, so the probability of rolling each value, 1 to K1, K2, K3 is exactly 1 / K1, 1 / K2 and 1 / K3. You have a counter,
and the game is played as follow:
- Set the counter to 0 at first.
- Roll the 3 dice simultaneously. If the up-facing number of Die1 is a, the up-facing number of Die2 is b and the up-facing number of Die3 is c, set the counter to 0. Otherwise,
add the counter by the total value of the 3 up-facing numbers. - If the counter's number is still not greater than n, go to step 2. Otherwise the game is ended.
Calculate the expectation of the number of times that you cast dice before the end of the game.
Input
There are multiple test cases. The first line of input is an integer T (0 < T <= 300) indicating the number of test cases. Then T test cases follow. Each test
case is a line contains 7 non-negative integers n, K1, K2, K3, a, b, c (0 <= n <= 500, 1 < K1, K2, K3 <=
6, 1 <= a <= K1, 1 <= b <= K2, 1 <= c <= K3).
Output
For each test case, output the answer in a single line. A relative error of 1e-8 will be accepted.
Sample Input
2
0 2 2 2 1 1 1
0 6 6 6 1 1 1
Sample Output
1.142857142857143
1.004651162790698
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754
/*题意:
有三个骰子,分别有k1,k2,k3个面。
每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和。
当分数大于n时结束。求游戏的期望步数。初始分数为0 分析:
如果dp[i]表示拥有分数i到游戏结束的期望步数
则
(1):dp[i]=SUM(p[k]*dp[i+k])+p[0]*dp[0]+1;//p[k]表示添加分数为k的概率,p[0]表示分数变为0的概率
假定
(2):dp[i]=A[i]*dp[0]+B[i];
则
(3):dp[i+k]=A[i+k]*dp[0]+B[i+k];
将(3)代入(1)得:
(4):dp[i]=(SUM(p[k]*A[i+k])+p[0])*dp[0]+SUM(p[k]*B[i+k])+1;
将4与2做比較得:
A[i]=(SUM(p[k]*A[i+k])+p[0]);
B[i]=SUM(p[k]*B[i+k])+1;
当i+k>n时A[i+k]=B[i+k]=0可知
所以dp[0]=B[0]/(1-A[0])可求出
*************************************************************************
总结下这类概率DP:
既DP[i]可能由DP[i+k]和DP[i+j]须要求的比方DP[0]决定
相当于概率一直递推下去会回到原点
比方
(1):DP[i]=a*DP[i+k]+b*DP[0]+d*DP[i+j]+c;
可是DP[i+k]和DP[0]都是未知
这时候依据DP[i]的方程式如果一个方程式:
比方:
(2):DP[i]=A[i]*DP[i+k]+B[i]*DP[0]+C[i];
由于要求DP[0],所以当i=0的时候可是A[0],B[0],C[0]未知
对照(1)和(2)的区别
这时候对照(1)和(2)发现两者之间的区别在于DP[i+j]
所以依据(2)求DP[i+j]然后代入(1)消除然后对照(2)就能够得到A[i],B[i],C[i]
然后视详细情况依据A[i],B[i],C[i]求得A[0],B[0],C[0]继而求DP[0]
请看这题:http://acm.hdu.edu.cn/showproblem.php?pid=4035
*************************************************************************
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <map>
#include <cmath>
#include <iomanip>
#define INF 99999999
typedef long long LL;
using namespace std; const int MAX=500+10;
int n,k1,k2,k3,a,b,c;
double p[20],A[MAX+10],B[MAX+10]; void dfs(int i){//求A[i],B[i]
if(A[i]>0)return;
if(i>n){A[i]=B[i]=0;return;}
A[i]=p[0],B[i]=1;
for(int k=3;k<=k1+k2+k3;++k){
dfs(i+k);
A[i]+=p[k]*A[i+k];
B[i]+=p[k]*B[i+k];
}
} int main(){
int t;
scanf("%d",&t);
while(t--){
memset(p,0,sizeof p);
scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c);
p[0]=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){
p[i+j+k]+=p[0];//求i+j+k的概率
}
}
}
p[a+b+c]-=p[0];//a+b+c的分数不能等于a,b,c,所以须要减去
memset(A,0,sizeof A);
memset(B,0,sizeof B);
dfs(0);
/*memset(A,0,sizeof A);
memset(B,0,sizeof B);
for(int i=n;i>=0;--i){
A[i]=p[0],B[i]=1;
for(int k=3;k<=k1+k2+k3;++k){
A[i]+=p[k]*A[i+k];
B[i]+=p[k]*B[i+k];
}
}*/
printf("%.15f\n",B[0]/(1-A[0]));
}
return 0;
}
ZOJ3329之经典概率DP的更多相关文章
- ZOJ 3329 One Person Game (经典概率dp+有环方程求解)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3329 题意:现在有三个骰子,分别有k1,k2和k3面,面上的点就是1~ki ...
- poj 2096 Collecting Bugs 概率dp 入门经典 难度:1
Collecting Bugs Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 2745 Accepted: 1345 ...
- 动态规划之经典数学期望和概率DP
起因:在一场训练赛上.有这么一题没做出来. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6829 题目大意:有三个人,他们分别有\(X,Y,Z\)块钱 ...
- [转]概率DP总结 by kuangbin
概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...
- 2018.09.27 bzoj3029: 守卫者的挑战(概率dp)
传送门 概率dp经典题目. 直接f[i][j][k]f[i][j][k]f[i][j][k]表示当前是第i次挑战,已经胜利了j次,目前的背包剩余空间是k. 然后用前面的转移后面的就行了. 注意第三维可 ...
- 2018.09.24 bzoj1867: [Noi1999]钉子和小球(概率dp)
传送门 概率dp经典题. 如果当前位置(i,j)(i,j)(i,j)有钉子,那么掉到(i+1,j),(i+1,j+1)(i+1,j),(i+1,j+1)(i+1,j),(i+1,j+1)的概率都是1/ ...
- 【整理】简单的数学期望和概率DP
数学期望 P=Σ每一种状态*对应的概率. 因为不可能枚举完所有的状态,有时也不可能枚举完,比如抛硬币,有可能一直是正面,etc.在没有接触数学期望时看到数学期望的题可能会觉得很阔怕(因为我高中就是这么 ...
- 概率dp集合
bzoj1076 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后 ...
- DP专题之概率DP
注意:在概率DP中求期望要逆着推,求概率要正着推 概率DP求期望: 链接: http://acm.hdu.edu.cn/showproblem.php?pid=4405 dp[ i ]表示从i点走到n ...
随机推荐
- PHPCMS(2)PHPCMS V9 环境搭建(转)
转自:http://www.cnblogs.com/Braveliu/p/5072920.html PHPCMS V9的学习总结分为以下几点: [1]PHPCMS 简介 PHP原始为Personal ...
- [jQuery编程挑战]007 切换数据表格的行列
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="utf-8&quo ...
- Linux之Vim编辑器使用
vim文本编辑器用于建立 编辑 显示文本文件,vim没有菜单,只有命令 在windows 平台下可使用gvim进行编写 Vim三种工作模式: 常有命令: 1.INSERT插入命令 i 在光标前插入 I ...
- JQuery解析HTML、JSON和XML实例详解
1.HTML 有的时候会将一段HTML片段保存在HTML文件中,在另外的主页面直接读取该HTML文件,然后解析里面的HTML代码片段融入到主页面中. fragment.html文件,其内容: 复制代码 ...
- #module-django.db.models
Models A model is the single, definitive source of information about your data. It contains the esse ...
- BTREE与其它索引的优缺点对比
数据库BTree索引.Hash索引.Bitmap位图索引的优缺点 (2016-01-05 17:13:40) 转载▼ 标签: 数据库 索引 mysql oracle 分类: IT http://www ...
- Ubuntu系统使用技巧
======================vbox 显示模式=====================right_ctrl+c 自动缩放right_ctrl_home 显示菜单====== ...
- ubuntu下配置protobuf
http://blog.csdn.net/guoyilongedu/article/details/17093811 最近想研究protobuf ,尝试了很多次都没有成功,我用的是ubuntu,在虚拟 ...
- Node.js REPL终端
REPL表示读取评估和演示打印循环(Read Eval Print Loop),它代表一个命令输入和系统在交互模式的输出响应窗口控制台或Unix/ Linux的shell计算机环境. Node.js附 ...
- 工业CF卡与商业CF卡对比
工业CF卡:1.SLC FLASH芯片 .每个区块读写次数为10万次 2.可分区 识别为本地磁盘 3.平均写入技术.ECC自动校验技术 4.完全模拟硬盘引导系统开机,支持长期稳定工作 商业CF卡:1. ...