原题地址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的更多相关文章

  1. 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< ...

  2. zoj 3822(概率dp)

    ZOJ Problem Set - 3822 Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Ju ...

  3. zoj 3822 Domination (概率dp 天数期望)

    题目链接 参考博客:http://blog.csdn.net/napoleon_acm/article/details/40020297 题意:给定n*m的空棋盘 每一次在上面选择一个空的位置放置一枚 ...

  4. zoj 3640 Help Me Escape 概率DP

    记忆化搜索+概率DP 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #include ...

  5. ZOJ 3822 Domination(概率dp 牡丹江现场赛)

    题目链接:problemId=5376">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5376 Edward ...

  6. ZOJ 3822 Domination 概率dp 难度:0

    Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headm ...

  7. zoj 3822 Domination 概率dp 2014牡丹江站D题

    Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headm ...

  8. ZOJ 3822 ( 2014牡丹江区域赛D题) (概率dp)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5376 题意:每天往n*m的棋盘上放一颗棋子,求多少天能将棋盘的每行每列都至少有 ...

  9. 概率dp专场

    专题链接 第一题--poj3744 Scout YYF I  链接 (简单题) 算是递推题 如果直接推的话 会TLE 会发现 在两个长距离陷阱中间 很长一部分都是重复的 我用 a表示到达i-2步的概率 ...

随机推荐

  1. hdu-1054(二分图最大匹配)

    题意:给你一个图,图里有墙壁和空地,空地可以放置一台机关枪,机关枪可以朝着四个方向发射,子弹不能穿透墙壁,但是射程无限,机关枪会被损坏如果被另一台机关枪的子弹打到,问你最多能放置多少台机关枪: 解题思 ...

  2. rk3128 通过串口控制 GPIO

    2019-04-24 关键字: rk平台控制GPIO功能.rk串口控制引脚电平 本篇文章介绍了如何通过串口来控制 RK3128.RK3288 平台的 GPIO . 我们可以很便捷地通过串口命令来控制 ...

  3. Linux下的Locale详解

    locale这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多.Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境. loca ...

  4. BZOJ 2594 水管局长数据加强版

    LCT维护最小生成树 要求两点路径最大的最小,首先想到的肯定是最小生成树,再加上有删边操作,那就得用LCT维护了. 可是对于cut一条边,我们要时刻维护图中的最小生成树,需要把之前被我们淘汰的边找回, ...

  5. 【dp】求最长公共子序列

    [题目描述] 一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列X=<x1,x2,…,xm>X=<x1,x2,…,xm>,则另一序列Z=<z1 ...

  6. NOI2019十二省联考旅游记

    真的是去旅游的啊,毕竟菜是原罪嘛 Day 0 去指定地点试机,果然,键盘还是一如既往的不好用,我也不知道为什么. 晚上,教练请吃自助餐,幸福的像个胖子 Day 1 早上坐车过去,在车上看了看原来写过的 ...

  7. Outlook 2013 日历/任务本地备份与还原

    1.日历: 备份日历:切换到日历项,按如下步骤备份.文件 --> 保存日历 --> 其它选项: 日期范围:指定日期(开始日期:2018/1/1,结束日期:2018/12/31) 详细信息: ...

  8. Unity安装(Windows版)

    Unity下载助手 Unity下载助手是一个小型可执行程序(大小约为1 MB),它允许您选择要下载和安装的Unity Editor的那些组件. 如果你不知道要安装,保留默认选择,单击继续 ,然后按照安 ...

  9. Maven 学习总结 (七) 之 灵活构建

    一个优秀的构建系统必须足够灵活,他应该能够让项目在不同的环境下都能成功地构建.Maven为支持项目的灵活性,内置了三大特性,即属性.Profile和资源过滤. Maven属性 通过<proper ...

  10. 桥接模式-Bridge(Java实现)

    桥接模式-Bridge 桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦, 将"类的功能层次结构" 与 "类的实 ...