博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zoj3329(概率dp)
阅读量:7094 次
发布时间:2019-06-28

本文共 1407 字,大约阅读时间需要 4 分钟。

 

题目连接:

题意:有三个骰子,分别有k1,k2,k3个面。 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和。 当分数大于n时结束。求游戏结束时的期望步数。

分析:这题状态转移方程挺容易想,但递推化简时又是困难重重,还是得多练习。

设dp[i]表示在i分时到达目标状态的期望,pk为投掷k分的概率,p0为回到0的概率

则dp[i]=∑(pk*dp[i+k])+dp[0]*p0+1; 都和dp[0]有关系,而且dp[0]就是我们所求,为常数

设dp[i]=A[i]*dp[0]+B[i];

代入上述方程右边得到: dp[i]=∑(pk*A[i+k]*dp[0]+pk*B[i+k])+dp[0]*p0+1 =(∑(pk*A[i+k])+p0)dp[0]+∑(pk*B[i+k])+1;

明显 A[i]=(∑(pk*A[i+k])+p0)   B[i]=∑(pk*B[i+k])+1

先递推求得A[0]和B[0]. 那么 dp[0]=B[0]/(1-A[0]);

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long#define mod 100000000#define inf 0x3f3f3f3f#define eps 1e-9#define N 100010#define FILL(a,b) (memset(a,b,sizeof(a)))#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;double A[600],B[600],p[100];int main(){ int T,n; int k1,k2,k3,a,b,c; scanf("%d",&T); while(T--) { scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c); double p0=1.0/k1/k2/k3; FILL(p,0); for(int i=1;i<=k1;i++) for(int j=1;j<=k2;j++) for(int l=1;l<=k3;l++) if(i!=a||j!=b||l!=c) p[i+j+l]+=p0; FILL(A,0);FILL(B,0); for(int i=n;i>=0;i--) { A[i]=p0;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("%.15lf\n",B[0]/(1-A[0])); }}
View Code

 

转载于:https://www.cnblogs.com/lienus/p/4264921.html

你可能感兴趣的文章
反射的两个过滤枚举
查看>>
Android编程之常识 - 混淆
查看>>
源码分析六(org.springframework.util包之Assert类)
查看>>
源码分析八(org.springframework.util包之StringUtils类))
查看>>
#include<> 和 #include""的区别
查看>>
【转】最近很火的 Safe Area 到底是什么
查看>>
java EE 环境配置(JDK + Tomcat + Eclipse for java EE)
查看>>
【转】【Python】Python正则表达式使用指导
查看>>
c#去掉guid中间的横杆
查看>>
使用Data Annotations进行手动数据验证
查看>>
php 禁止 URL 直接访问 php文件
查看>>
Summary: gcd最大公约数、lcm最小公倍数算法
查看>>
Linux 内核与模块调试
查看>>
Leetcode: Single Number III
查看>>
对tmemorystream的一些改进_delphi教程
查看>>
【iCore3 双核心板_FPGA】实验十八:基于单口RAM的ARM+FPGA数据存取实验
查看>>
内存控制函数(1)-mmap() 建立内存映射
查看>>
urllib的实现---cookie处理
查看>>
私有继承于Noncopyable,屏蔽默认拷贝构造与默认复制构造
查看>>
设计模式:抽象工厂方法模式
查看>>