题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4652

题意:

  给你一个有m个面的骰子。

  两种询问:

    (1)"0 m n": “最后n次点数均相同”的投掷次数期望。

    (2)"1 m n": “最后n次点数各不相同”的投掷次数期望。

题解:

  表示状态:

    dp[i] = expectation (当前已经有i个点数相同/不相同)

  找出答案:

    ans = dp[0]

  如何转移:

  一、都相同

    (1)dp[i] = dp[i+1]/m + dp[1]*(1-1/m) + 1 (要么与前面相同,要么不同)

    (2)dp[i+1] = dp[i+2]/m + dp[1]*(1-1/m) + 1 (为了错位相减消去后面的dp[1],令i = i+1)

    (1)-(2)得:

      dp[i] - dp[i+1] = (dp[i+1] - dp[i+2])/m

    设d[i] = dp[i] - dp[i+1],有d[i+1]= dp[i]*m (d[i]可递推)

    则:dp[0] - dp[n] = sigma(d[0 to n-1]) (前后两项相消)

    又因为:dp[n] = 0

    所以:dp[0] = sigma(d[0 to n-1]),枚举求和即可。

  二、都不同

    (1)dp[i] = dp[i+1]*(m-i)/m + dp[i]/m + dp[i-1]/m +...+ dp[1]/m + 1 (要么与之前均不同,要么与第n,n-1,n-2...1位相同)

    (2)dp[i+1] = dp[i+2]*(m-i-1)/m + dp[i+1]/m + dp[i]/m +...+ dp[1]/m + 1 (令i = i+1,错位相减)

    (1)-(2)得:

      dp[i] - dp[i+1] = (dp[i+1] - dp[i+2])*(m-i-1)/m

    设d[i] = dp[i] - dp[i+1],有d[i+1]= dp[i]*m/(m-i-1) (d[i]可递推)

    则:dp[0] - dp[n] = sigma(d[0 to n-1])

    同一中:dp[0] = sigma(d[0 to n-1]) 即为答案。

AC Code:

 // PROB 1: is the same
//
// state expresssion:
// dp[i] = expectation
// i: the same numbers
//
// find the answer:
// ans = dp[1] + 1
//
// transferring:
// dp[i] = dp[i+1]/m + dp[1]*(1-1/m) + 1
// dp[i+1] = dp[i+2]/m + dp[1]*(1-1/m) + 1
// dp[i] - dp[i+1] = dp[i+1]/m - dp[i+2]/m
// dp[i] - dp[i+1] = (dp[i+1] - dp[i+2])/m
// dp[i+1] - dp[i+2] = (dp[i] - dp[i+1])*m
// d[0] = dp[0] - dp[1] = 1
// dp[0] + dp[n] = sigma(d[0 to n-1])
// dp[0] = sigma(d[0 to n-1])
//
//
// PROB 2: is different
//
// state expression:
// dp[i] = expectation
// i: different numbers
//
// find the answer:
// ans = dp[1] + 1
//
// transferring:
// dp[i] = dp[i+1]*(m-i)/m + dp[i]/m + dp[i-1]/m +...+ dp[1]/m + 1
// dp[i+1] = dp[i+2]*(m-i-1)/m + dp[i+1]/m + dp[i]/m +...+ dp[2]/m + dp[1]/m + 1
// dp[i] - dp[i+1] = dp[i+1]*(m-i)/m - dp[i+2]*(m-i-1)/m - dp[i+1]/m
// dp[i] - dp[i+1] = (dp[i+1] - dp[i+2])*(m-i-1)/m
// dp[i+1] - dp[i+2] = (dp[i] - dp[i+1])*m/(m-i-1)
// d[0] = dp[0] - dp[1] = 1
// dp[0] + dp[n] = sigma(d[0 to n-1])
// dp[0] = sigma(d[0 to n-1])
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1000005 using namespace std; int n,m,p,t;
double ans;
double dp[MAX_N]; void read()
{
cin>>p>>m>>n;
} void cal_dp_same()
{
// dp[i+1] - dp[i+2] = (dp[i] - dp[i+1])*m
// dp[0] = sigma(d[0 to n-1])
double d=;
ans=;
for(int i=;i<n;i++)
{
ans+=d;
d*=m;
}
} void cal_dp_dif()
{
// dp[i+1] - dp[i+2] = (dp[i] - dp[i+1])*m/(m-i-1)
// dp[0] = sigma(d[0 to n-1])
double d=;
ans=;
for(int i=;i<n;i++)
{
ans+=d;
d*=m/(m-i-1.0);
}
} void solve()
{
if(p==) cal_dp_same();
else cal_dp_dif();
} void print()
{
printf("%.9f\n",ans);
} int main()
{
while(cin>>t)
{
while(t--)
{
read();
solve();
print();
}
}
}

dp[i] = dp[i+1]*(m-i)/m + dp[i]/m + dp[i-1]/m +...+ dp[1]/m + 1

HDU 4652 Dice:期望dp(成环)【错位相减】的更多相关文章

  1. hdu 4652 Dice 概率DP

    思路: dp[i]表示当前在已经投掷出i个不相同/相同这个状态时期望还需要投掷多少次 对于第一种情况有: dp[0] = 1+dp[1] dp[1] = 1+((m-1)*dp[1]+dp[2])/m ...

  2. HDU 4652 Dice (概率DP)

    版权声明:欢迎关注我的博客,本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/36685493 D ...

  3. HDU 4652 Dice

    嘟嘟嘟 题目大意就是对于一个m面的骰子,回答这么两个问题: 1.求连续扔n次都是同一数字的期望次数. 2.求连续扔n次每一次数字都不相同的期望次数. 对于期望dp特别菜的我来说,这道题已经算是很难了. ...

  4. HDU 4652 Dice(期望)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4652 题意:一个m个面的筛子.两种询问:(1)平均抛多少次后使得最后n次的面完全一样:(2)平均抛多少 ...

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

  6. hdu 4599 Dice 概率DP

    思路: 1.求f[n];dp[i]表示i个连续相同时的期望 则 dp[0]=1+dp[1]     dp[1]=1+(5dp[1]+dp[2])/6     ……     dp[i]=1+(5dp[1 ...

  7. Maze HDU - 4035(期望dp)

    When wake up, lxhgww find himself in a huge maze. The maze consisted by N rooms and tunnels connecti ...

  8. [spoj Favorite Dice ][期望dp]

    (1)https://vjudge.net/problem/SPOJ-FAVDICE 题意:有一个n面的骰子,每一面朝上的概率相同,求所有面都朝上过至少一次的总次数期望. 题解:令dp[i]表示 i ...

  9. HDU 3853 LOOPS 期望dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3853 LOOPS Time Limit: 15000/5000 MS (Java/Others)Me ...

随机推荐

  1. 跳转前暂停几秒js如何实现

    jquery如何实现跳转前暂停几秒 今天有个需求,类似答题的,需要显示结果后再跳转. 此处直接通过settimeout实现. 代码如下: url = 'www.baidu.com'; setTimeo ...

  2. Web安全系列(三):XSS 攻击进阶(挖掘漏洞)

    前言 在前些章节 (web安全系列(一):XSS 攻击基础及原理)以及(Web安全系列(二):XSS 攻击进阶(初探 XSS Payload))中,我详细介绍了 XSS 形成的原理以及 XSS 攻击的 ...

  3. 转:几款主流pcb软件比较

      原理图设计软件:会ORCAD就可以了,支持的Netlist超多,基本是业界标准. PCB Layout 软件 1.Protel,现在推AltiumDesigner.国内低端设计的主流,国外基本没人 ...

  4. SpringMVC请求流程与原理分析

    SpringMVC的工作原理图: SpringMVC流程 1.  用户发送请求至前端控制器DispatcherServlet. 2.  DispatcherServlet收到请求调用HandlerMa ...

  5. 并发错误:事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品

    这个是并发情况下导致的数据库事务错误,先介绍下背景. 背景 springboot+springmvc+sqlserver+mybatis 一个controller里有五六个接口,这些接口都用到了spr ...

  6. JVM、垃圾回收、内存调优、常见參数

    一.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写.JVM是一种用于计算设备的规范.它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现 ...

  7. js关于变量作为if条件的真假问题

    var a = ""; if(a){ ..... }else{ .....} 以下情况会被认为返回false: "" 空的字符串 为 0 的数字 为 null ...

  8. Emgu安装配置及使用

    前言:项目需要,需使用图像处理来完成机械臂从运动的皮带上抓取物体的功能,所以又重拾视觉与图像处理内容. 内容:Emgu是OpenCV的一个跨平台的.NET封装,结构如下图所示: 下载地址:http:/ ...

  9. COGS1817. [WC2013]糖果公园

    1817. [WC2013]糖果公园 ★★★☆   输入文件:park.in   输出文件:park.out   简单对比时间限制:8 s   内存限制:512 MB [题目描述] Candyland ...

  10. RSA加密、解密、公钥私钥生成

    有时项目中需要用到一些加密和解密工具,这里之前整理了一个demo,记录一下,方便查询 package com.test; import java.security.KeyFactory; import ...