成环的概率dp(初级) zoj 3329
原题地址:https://vjudge.net/problem/ZOJ-3329
题目大意:
有三个骰子,分别有k1,k2,k3个面,初始分数是0。第i骰子上的分数从1道ki。当掷三个骰子的点数分别为a,b,c的时候,分数清零,否则分数加上三个骰子的点数和,当分数>n的时候结束。求需要掷骰子的次数的期望。
(0<=n<= 500,1<K1,K2,K3<=6,1<=a<=K1,1<=b<=K2,1<=c<=K3)
思路:
如果设当前分数为 i ,且再有 dp[ i ] 次投掷可以达到分数 n
设该次投出的点数为 k
那么容易写出状态转移方程 dp[ i ] = ∑ ( dp[ i+k ] * p[ k ] ) + dp[ 0 ] * p[ 0 ] + 1
因为从当前状态开始,再投一次( 这就是式子中 +1 的由来 ) 可能到达的分数有 k 种,概率分别为 p[ 1 ] 到 p[ k ] (当然, p[ 1 ] , p [ 2 ]已被初始化为 0 .
除此之外 ,也可能投出 k1=a,k2=b,k3=c 的组合,因此要加上 dp[ 0 ] * p[ 0 ] 这一项 .
至此,我们得到了转移方程
但是,经过观察我们可以发现它实际上是不能用的
大凡可以使用的方程,必定是从一个方向推向另一个方向,要么从小到大(正推) ,要么从大到小(逆推)
但是这个方程中,右边的项同时包含了比 i 大的( dp[ i+k ] ) 和比 i 小的( dp[ 0 ] )
这就使dp 陷入一个自身依赖自身的环中
一般遇到这种情况,我们会采取高斯消元法解方程来解决
但因为博主太菜了,还不会(会补的,会补的......)
同时,这道题中阻碍我们进行 dp 的只有 dp[ 0 ] 这一项
因此我们采取将 dp[ 0 ] 设为未知数的方法
注意到,每个 dp[ i ] 都含有相同的元素 dp[ 0 ]
则 dp[ i ] 是 dp [ 0 ] 的一个线性组合( 因为没有出现 dp[ 0 ] 的高次幂)
因此可以将转移方程写成 dp[ i ] = dp[ 0 ] * a[ i ]+b[ i ] ············( 1 )
于是就有 dp[ i+k ] = dp[0] * a[ i+k ]+b[ i+k ]
把这个式子带入原来的转移方程得到 dp[ i ] = dp[ 0 ] * p[ 0 ] + ∑( dp[ i+k ] * p[ i+k ] ) + 1
再将这个式子中的 dp[ 0 ] 分离出来,化成与式 ( 1 ) 相同的形式 dp[ i ] = dp[ 0 ] * ( ∑ ( a[ i+k ] * p[ i+k ] ) + p[ 0 ] ) + ( ∑( b[ i+k ] * p[ i+k ] ) + 1 )
我们把( 1 )式拉下来,让你看得更清楚: dp[ i ] = dp[0] * a[ i ] + b[ i ]
因此,我们得到了新的,关于 a,b 的方程:
a[ i ] = ∑ ( a[ i+k ] * p[ i+k ] ) + p[ 0 ]
b[ i ] =∑ ( b[ i+k ] * p[ i+k ] ) + 1
我们惊喜地发现,这是两个状态转移方程!
我们可以通过逆推得到 a[ 0 ] 和 b[ 0 ]
还记得式(1)吗?如果我们把它的 i 取成 0 ,就得到:
dp[ 0 ] = dp[ 0 ] * a[ 0 ]+b[ 0 ]
我们终于能够解出 dp[ 0 ]
而这也正是本题的答案
下边附上kuagnbin 大大的代码:
·
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std; double A[],B[];
double p[];
int main()
{
int T;
int k1,k2,k3,a,b,c;
int n;
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;
memset(p,,sizeof(p));
for(int i=;i<=k1;i++)
for(int j=;j<=k2;j++)
for(int k=;k<=k3;k++)
if(i!=a||j!=b||k!=c)
p[i+j+k]+=p0;
memset(A,,sizeof(A));
memset(B,,sizeof(B));
for(int i=n;i>=;i--)
{
A[i]=p0;B[i]=;
for(int j=;j<=k1+k2+k3;j++)
{
A[i]+=A[i+j]*p[j];
B[i]+=B[i+j]*p[j];
}
}
printf("%.16lf\n",B[]/(-A[]));
}
return ;
}
博主新手上路,觉得不错的能否赏个赞或关注?
觉得有写得不好的地方也欢迎大家指正,我会及时修改!
成环的概率dp(初级) zoj 3329的更多相关文章
- poj 2096 Collecting Bugs && ZOJ 3329 One Person Game && hdu 4035 Maze——期望DP
poj 2096 题目:http://poj.org/problem?id=2096 f[ i ][ j ] 表示收集了 i 个 n 的那个. j 个 s 的那个的期望步数. #include< ...
- zoj 3822(概率dp)
ZOJ Problem Set - 3822 Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Ju ...
- zoj 3822 Domination (概率dp 天数期望)
题目链接 参考博客:http://blog.csdn.net/napoleon_acm/article/details/40020297 题意:给定n*m的空棋盘 每一次在上面选择一个空的位置放置一枚 ...
- zoj 3640 Help Me Escape 概率DP
记忆化搜索+概率DP 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #include ...
- ZOJ 3822 Domination(概率dp 牡丹江现场赛)
题目链接:problemId=5376">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5376 Edward ...
- ZOJ 3822 Domination 概率dp 难度:0
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...
- zoj 3822 Domination 概率dp 2014牡丹江站D题
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...
- ZOJ 3822 ( 2014牡丹江区域赛D题) (概率dp)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5376 题意:每天往n*m的棋盘上放一颗棋子,求多少天能将棋盘的每行每列都至少有 ...
- 概率dp专场
专题链接 第一题--poj3744 Scout YYF I 链接 (简单题) 算是递推题 如果直接推的话 会TLE 会发现 在两个长距离陷阱中间 很长一部分都是重复的 我用 a表示到达i-2步的概率 ...
随机推荐
- JavaScript继承总结
1.创建对象 1.字面量对象 2.构造函数 3.Object.create //1.字面量 var obj={ name: '字面量', show: function(){ console.log(t ...
- C语言博客作业03--函数
1.本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 这周最大的收获就是学习函数,并且通过对函数的封装来做成一个简单的小程序,这周做的最有意义的事情就是做了老 ...
- 清北学堂(2019 4 28 ) part 1
今天主要用来铺路,打基础 枚举 没什么具体算法讲究,但要考虑更优的暴力枚举方法,例如回文质数,有以下几种思路: 1.挨个枚举自然数,再一起判断是否是回文数和质数,然而一看就不是最优 2.先枚举质数再判 ...
- [2019.03.22] Linux 学习心得(1)
本文关键词:shell 判断.grep正则表达式使用和贪婪匹配理解 1. if [ $a -le $b ], 一开始自学的时候我以为 [ ... ] 就是普通的,语法规定的结构,结果其实人家是&quo ...
- JSP/JSF从web.xml中取出context-param的配置信息
JSP/JSF从web.xml中取出context-param的配置信息. 应用场景:我们配置了项目的版本信息,想让他显示在页面上,如: <context-param><!-- ## ...
- 【THUSC2017】【LOJ2981】如果奇迹有颜色 DP BM 打表 线性递推
题目大意 有一个 \(n\) 个点的环,你要用 \(m\) 中颜色染这 \(n\) 个点. 要求连续 \(m\) 个点的颜色不能是 $1 \sim m $ 的排列. 两种环相同当且仅当这两个环可以在旋 ...
- 通用权限管理系统之权限菜单zTree树的展示及移动的处理方法
在通用权限管理系统中,有很多数据结构是有父子关系的,如组织机构,部门,权限菜单等,在展示的时候,大多数是通过zTree树的形式展现的,如下: 权限菜单展示 这种数据后台输出比较容易处理,参考如下获取某 ...
- maven settings.xml--需要保存到用户/.m2文件夹下
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...
- java 数字左补齐0
NumberFormat nf = NumberFormat.getInstance(); //设置是否使用分组 nf.setGroupingUsed(false); ...
- 最大似然估计与期望最大化(EM)算法
一.最大似然估计与最大后验概率 1.概率与统计 概率与统计是两个不同的概念. 概率是指:模型参数已知,X未知,p(x1) ... p(xn) 都是对应的xi的概率 统计是指:模型参数未知,X已知,根据 ...