题目链接: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. mysql使用mysqldump 与 mysqlimport进行数据库迁移

    1.导入数据库 1)source source /home/platvt/product/pc2_create_tables.sql 2)mysqlimport 使用mysqlimport导入数据: ...

  2. JS创建表单提交备份

    //保存 function saveFT() { var data = { createDate: GetDateStr(0), name: $("#txtName").val() ...

  3. HTML5 手机网页制作笔记

    http://top.css88.com/archives/546 http://www.w3cfuns.com/blog-5470280-5406828.html 最近在卓手机网页,第一次入手.把要 ...

  4. unslider点导航不显示错误

    原因是,unslider插件只添加了dots文件并没有设置样式 解决办法 .banner { position: relative; width: 100%; overflow: auto; font ...

  5. wifi认证Portal开发系列(四):portal协议的java封装

     一.报文封装类 AbstractPortalMsg.java Portal协议数据报文封装类 package org.yoki.edu.common.protocol.portal.msg; imp ...

  6. linux uart驱动——uart platfrom 注册(三)

    一:注册platform device 注册一个platfrom device一般需要初始化两个内容,设备占用的资源resource和设备私有数据dev.platfrom_data.设备的resour ...

  7. linux启动参数了解

    文章来源:http://blog.csdn.net/uyiwfn/article/details/7172339在Linux中,给kernel传递参数以控制其行为总共有三种方法:1.build ker ...

  8. Android 音频 OpenSL ES 录音 采集

    1,; int channelConfig = AudioFormat.CHANNEL_OUT_STEREO; int audioFormat = AudioFormat.ENCODING_PCM_1 ...

  9. python使用模板手记

    1.首先是$符号 在webpy中,模板html里面可以写python代码,但要用$开始.但如果网页代码本来就有$符号(javascript或者正则表达式),我们需要对其进行转意.用$$代替$ 给jqu ...

  10. phpstorm pycharm IntelliJ IDEA激活

    phpstorm 和 pycharm server选项里边输入 http://idea.imsxm.com/ IntelliJ IDEA 1. 到网站 http://idea.lanyus.com/  ...