题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3329

题意:

  给你面数分别为k1,k2,k3的三个骰子。

  给定a,b,c三个整数。

  三个骰子每扔一次,若骰子朝上的点数分别为a,b,c,则分数清零,否则当前分数+=骰子点数之和。

  当分数 > n时游戏结束。

  问你扔骰子次数的期望。

题意:

  表示状态:

    dp[i] = rest steps

    (当前分数为i时,剩余步数的期望)

  找出答案:

    ans = dp[0]

    刚开始分数为0。

  如何转移:

    由于此题中可以由高分数转移到低分数,所以转移存在环。

    一般有环dp用高斯消元做。

    但是,此题的所有环都跟dp[0]有关,也就是说所有的转移都能写成形如 dp[i] = a[i]*dp[0] + b[i] 的形式(分离系数)。

    那么求出a[0]和b[0]就可以行了,答案为dp[0] = b[0] / (1-a[0])。

    (1)dp[i] = sigma(dp[i+k]*p[k]) + dp[0]*p[0] + 1 (原转移方程,p[i]为扔出点数为i的概率,p[0]为扔出(a,b,c)的概率)

    (2)dp[i] = a[i]*dp[0] + b[i] (假设的)

    将(2)代入(1):

      dp[i] = sigma( (a[i+k]*dp[0] + b[i+k]) * p[k] ) + dp[0]*p[0] + 1

      dp[i] = sigma( a[i+k]*dp[0]*p[k] + b[i+k]*p[k] ) + dp[0]*p[0] + 1

      dp[i] = ( sigma(a[i+k]*p[k]) + p[0] )*dp[0] + sigma(b[i+k]*p[k]) + 1

    系数对应相等:

      a[i] = sigma(a[i+k]*p[k]) + p[0]

      b[i] = sigma(b[i+k]*p[k]) + 1

    递推求出a[i] & b[i]即可,求的时候要保证i <= n(有意义)。

    dp[0] = b[0] / (1-a[0])。

AC Code:

 // state expression:
// dp[i] = rest steps
// i: present score
//
// find the answer:
// ans = dp[0]
//
// transferring:
// 1) dp[i] = sigma(dp[i+k]*p[k]) + dp[0]*p[0] + 1
// 2) dp[i] = a[i]*dp[0] + b[i]
// ***solve:
// dp[i] = sigma( (a[i+k]*dp[0] + b[i+k]) * p[k] ) + dp[0]*p[0] + 1
// dp[i] = sigma( a[i+k]*dp[0]*p[k] + b[i+k]*p[k] ) + dp[0]*p[0] + 1
// dp[i] = ( sigma(a[i+k]*p[k]) + p[0] )*dp[0] + sigma(b[i+k]*p[k]) + 1
// ***result:
// a[i] = sigma(a[i+k]*p[k]) + p[0]
// b[i] = sigma(b[i+k]*p[k]) + 1
// ***run:
// cal a[i] & b[i]
// dp[0] = b[0] / (1-a[0])
//
// boundary:
// set a,b = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 505
#define MAX_K 40 using namespace std; int n,t;
int k1,k2,k3;
int e1,e2,e3;
double p[MAX_K];
double a[MAX_N];
double b[MAX_N];
double dp[MAX_N]; void read()
{
cin>>n>>k1>>k2>>k3>>e1>>e2>>e3;
} void cal_pro()
{
memset(p,,sizeof(p));
p[]=1.0/(k1*k2*k3);
for(int i=;i<=k1;i++)
{
for(int j=;j<=k2;j++)
{
for(int k=;k<=k3;k++)
{
if(i!=e1 || j!=e2 || k!=e3)
{
p[i+j+k]+=p[];
}
}
}
}
} void cal_const()
{
memset(a,,sizeof(a));
memset(b,,sizeof(b));
for(int i=n;i>=;i--)
{
for(int k=;k<=k1+k2+k3;k++)
{
if(i+k>n) break;
a[i]+=a[i+k]*p[k];
b[i]+=b[i+k]*p[k];
}
a[i]+=p[];
b[i]+=1.0;
}
} void solve()
{
cal_pro();
cal_const();
dp[]=b[]/(1.0-a[]);
} void print()
{
printf("%.15f\n",dp[]);
} int main()
{
cin>>t;
while(t--)
{
read();
solve();
print();
}
}

ZOJ 3329 One Person Game:期望dp【关于一个点成环——分离系数】的更多相关文章

  1. ZOJ 3329 Problem Set (期望dp)

    One Person Game There is a very simple and interesting one-person game. You have 3 dice, namely Die1 ...

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

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

  3. 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]= ...

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

  5. poj 2096 , zoj 3329 , hdu 4035 —— 期望DP

    题目:http://poj.org/problem?id=2096 题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种: 所以设 f[i][j] 表示已经有几种 ...

  6. ZOJ 3822 Domination 期望dp

    Domination Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showProblem ...

  7. 成环的概率dp(初级) zoj 3329

    原题地址:https://vjudge.net/problem/ZOJ-3329 题目大意: 有三个骰子,分别有k1,k2,k3个面,初始分数是0.第i骰子上的分数从1道ki.当掷三个骰子的点数分别为 ...

  8. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

  9. [NOIP2016]换教室 D1 T3 Floyed+期望DP

    [NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...

随机推荐

  1. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第04章 | 字典

    第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中.键能够使字符.数字.或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每一个键都是由坐标值组 ...

  2. [C++设计模式] state 状态模式

    <head first 设计模式>中的样例非常不错,想制造一个自己主动交易的糖果机,糖果机有四个状态:投入钱不足,投入钱足够,出售糖果,糖果售罄. 糖果机的当前状态处于当中不同的状态时,它 ...

  3. MySql(四):备份与恢复

    一.数据库备份使用场景 下面我就列举一下我个人理解的我们能够需要用到数据库备份的一些比较常见的情况吧. a.数据丢失应用场景 1.人为操作失误造成某些数据被误操作:2.软件BUG 造成数据部分或者全部 ...

  4. rst2pdf 中文

    上篇说到用pandoc转换为reST为pdf是使用LaTeX作为中间格式的,而今天要说的rst2pdf貌似是直接转换为pdf的. 安装和调用 rst2pdf目前只支持Python2.7,因此在创建vi ...

  5. 设置mysql隔离级别

    1.查看当前会话隔离级别 select @@tx_isolation; 2.查看系统当前隔离级别 select @@global.tx_isolation; 3.设置当前会话隔离级别 set sess ...

  6. 深入理解Java 8 Lambda

    - 转载:blog1, blog2 以上两篇博客是对lambda表达式的深入理解,用于后续加深理解. 如下先从零开始理解lambda, 1. 接触lambda表达式是从python,javascrip ...

  7. linux SPI驱动——gpio模拟spi驱动(三)

    一:首先在我的平台注册platform_device,保证能让spi-gpio.c能执行到probe函数. 1: struct spi_gpio_platform_data { 2: unsigned ...

  8. 【selenium+Python unittest】之发送带中文附件的邮箱

    完整原码如下: import smtplib from email.mime.text import MIMEText #from email.header import Header from em ...

  9. Oracle -- Create User

    CREATE USER hibernate IDENTIFIED BY "123" DEFAULT TABLESPACE "HIBERNATE" TEMPORA ...

  10. 3_Jsp标签_简单标签_防盗链和转义标签的实现

    一概念 1防盗链 在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件,通过referer,网站可以检测目标网页访问的来源网页.有了referer跟踪来 ...