题意:每次筛三个骰子面分别为k1,k2,k3,如果三个骰子的值分别为a,b,c则得分置0,否则得到分数加上三个骰子的值的和,如果得分大于等于n则结束游戏。

设E[i]表示当前得到i分时结束游戏的期望。

则E[i]=sum{Pk*(E[i+k]+1)|k为三个骰子可能取得的分数且不包括a,b,c这种情况}+1/(k1*k2*k3)(E[0]+1)

=sum{Pk*(E[i+k])}+1/(k1*k2*k3)*E[0]+1

这里出现了一个问题,之前的方程都是只与一个方向的有关,而这里E[i]与E[0]和E[i+k]有关, E[0]是E[i]的先前结点,而E[i+k]是E[i]的后置结点,因此无法使用DP解决这个问题。我们考虑消去一个变量,这里只有最后的结点E[n]是已知的,所以我们可以消去后置结点E[i+k]。这样假设E[i]=A[i]*E[0]+B[i],代入E[i+k],可得E[i]=sum{Pk*(A[i+k]*E[0]+B[i+k])}+1/(k1*k2*k3)*E[0]+1,进一步得E[i]=(sum{Pk*A[i+k]}+1/(k1*k2*k3))*E[0]+sum{Pk}*B[i+k]+1。

这样对应系数可得到A[i]=sum{Pk*A[i+k]}+1/(k1*k2*k3),B[i]=sum{Pk}*B[i+k]+1。

我们知道E[n]=0,所以A[n]=0,B[n]=0。

这样可以递推求出所有A[i]和B[i],这样也就能算出所有的E[i]了。

最终答案是E[0]。E[0]=A[0]*E[0]+B[0],所以E[0]=B[0]/(1-A[0])。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define ll long long
#define MAXN 30005
using namespace std;
],B[];
];
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);
        double r=1.0/(k1*k2*k3);
        memset(A,,sizeof(A));
        memset(B,,sizeof(B));
        memset(pro,,sizeof(pro));
        ; i<=k1; ++i)
            ; j<=k2; ++j)
                ; k<=k3; ++k)
                    if(!(i==a&&j==b&&k==c))
                        pro[i+j+k]+=r;
        int s=k1+k2+k3;
        ; --i)
        {
            ; j<=s; ++j)
            {
                A[i]+=pro[j]*A[i+j];
                B[i]+=pro[j]*B[i+j];
            }
            A[i]+=r;
            B[i]++;
        }
        printf(]/(-A[]));
    }
    ;
}

ZOJ 3329 - One Person Game的更多相关文章

  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 3329 One Person Game (经典概率dp+有环方程求解)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3329 题意:现在有三个骰子,分别有k1,k2和k3面,面上的点就是1~ki ...

  3. ZOJ 3329 One Person Game:期望dp【关于一个点成环——分离系数】

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3329 题意: 给你面数分别为k1,k2,k3的三个骰子. 给定a ...

  4. ZOJ 3329 One Person Game 概率DP 期望 难度:2

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754 本题分数为0的概率不确定,所以不能从0这端出发. 设E[i]为到达成功所 ...

  5. ZOJ 3329 【概率DP】

    题意: 给你三个均匀k面筛子. 分别有k1 k2 k3个面,每个面朝上的概率是相等的. 如果第一个筛子出现a第二个筛子出现b第三个筛子出现c那么置零. 否则在当前和加上三个点数之和. 求当前和大于n需 ...

  6. zoj 3329 One Person Game (有环 的 概率dp)

    题目链接 这个题看的别人的思路,自己根本想不出来这种设方程的思路. 题意: 有三个骰子,分别有k1,k2,k3个面. 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和. 当 ...

  7. zoj 3329 One Person Game 概率DP

    思路:这题的递推方程有点麻烦!! dp[i]表示分数为i的期望步数,p[k]表示得分为k的概率,p0表示回到0的概率: dp[i]=Σ(p[k]*dp[i+k])+dp[0]*p0+1 设dp[i]= ...

  8. ZOJ 3329 One Person Game 带环的概率DP

    每次都和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+ ...

  9. ZOJ 3329 One Person Game 【概率DP,求期望】

    题意:有三个骰子,分别有k1,k2,k3个面. 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和. 当分数大于n时结束.求游戏的期望步数.初始分数为0 设dp[i]表示达到 ...

随机推荐

  1. Structs1 -配置例子(转)

    转自:(http://blog.csdn.net/xys_777/article/details/7542095) Action, ActionForm, ActionForward ,这三个对象构成 ...

  2. div contenteditable placeholder

    contenteditable型的编辑框,实现placeholder的方式有两种 第一种,Css的实现方式: <!DOCTYPE html> <html lang="en& ...

  3. 20145218 《Java程序设计》第8周学习总结

    20145218 <Java程序设计>第8周学习总结 教材学习内容总结 15.1 日志 15.1.1日志API简介 java.util.logging包提供了日志功能相关类与接口,不必额外 ...

  4. IE9以上 CSS文件因Mime类型不匹配而被忽略 其他浏览器及IE8以下显示正常

     什么是Mime类型? MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名 ...

  5. [redis] 征服Redis系列

    征服 Redis:简介+安装+调优+测试+主从+集群 征服 Redis + Jedis:简单Jedis+池化Jedis+集群Jedis 征服 Redis + Jedis + Spring (一)—— ...

  6. javascript常用函数(1):jquery操作select 基本操作

    $(this).children('option:selected').val();//这就是selected的值 $("#charCity").empty();//内容清空: j ...

  7. (01)odoo8.0_Ubuntu14.04源码安装

    作者:陈伟明联系 :  QQ 942923305 | 微信 toby942923305E-mail: toby2chen@hotmail.com============================ ...

  8. 如何使用Vbox添加虚拟机

    简介 :vbox是oracle旗下的一个免费的虚拟机软件. 个人感觉操作方便,至少比VM要好用的多. 如果有已经制作好的 点击下一步: 下一步 找到之后 创建 look

  9. Web前端开发面试题

    1. 以下的代码有问题吗?如果有你觉着应该如何修改? for(int i=0; i<list.size(); i++) {  .....  .....  if(...)  {   list.re ...

  10. iOS 10 消息推送(UserNotifications)秘籍总结(二)

    背景 上一篇博客iOS 10 消息推送(UserNotifications)秘籍总结(一)发布后被 简书编辑推荐至首页,这着实让我受宠若惊啊.可是好事不长,后面发生了让我伤心欲绝的事,我的女朋友不要我 ...