HDU 4652 Dice:期望dp(成环)【错位相减】
题目链接: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(成环)【错位相减】的更多相关文章
- hdu 4652 Dice 概率DP
思路: dp[i]表示当前在已经投掷出i个不相同/相同这个状态时期望还需要投掷多少次 对于第一种情况有: dp[0] = 1+dp[1] dp[1] = 1+((m-1)*dp[1]+dp[2])/m ...
- HDU 4652 Dice (概率DP)
版权声明:欢迎关注我的博客,本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/36685493 D ...
- HDU 4652 Dice
嘟嘟嘟 题目大意就是对于一个m面的骰子,回答这么两个问题: 1.求连续扔n次都是同一数字的期望次数. 2.求连续扔n次每一次数字都不相同的期望次数. 对于期望dp特别菜的我来说,这道题已经算是很难了. ...
- HDU 4652 Dice(期望)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4652 题意:一个m个面的筛子.两种询问:(1)平均抛多少次后使得最后n次的面完全一样:(2)平均抛多少 ...
- 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< ...
- 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 ...
- Maze HDU - 4035(期望dp)
When wake up, lxhgww find himself in a huge maze. The maze consisted by N rooms and tunnels connecti ...
- [spoj Favorite Dice ][期望dp]
(1)https://vjudge.net/problem/SPOJ-FAVDICE 题意:有一个n面的骰子,每一面朝上的概率相同,求所有面都朝上过至少一次的总次数期望. 题解:令dp[i]表示 i ...
- HDU 3853 LOOPS 期望dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3853 LOOPS Time Limit: 15000/5000 MS (Java/Others)Me ...
随机推荐
- SAS学习笔记之函数应用
今天在做数据需求的时候遇到一些问题,因为不能够在数据库里面做,仅仅好在SAS里面实现.这就遇到了一些麻烦,须要使用一些函数实现部分功能,如查找字段中某个特殊字符出现的次数,查找某个字符的位置等,以下一 ...
- dockerfile VOLUME 对外暴露目录设置问题
最近遇到一个特殊问题, 容器对外映射挂载目录 , 发现容器中的目录并没有映射到宿主机上. 后经排查是是镜像中没有指定 volume # 例如 FROM debian:wheezy VOLUME /da ...
- UDP通信注意事项
今天调试UDP,笔记本上面可以实现但台式机上面竟然无法通信,后来找了半天,原来是权限问题.必须将用户权限设置为最低才行. 在运行里面输入UAC (user access control )用户权限设置 ...
- vscode Python Pylint(代码检测插件)
暑假刚开始想了解一下Python,使用vscode进行编写,根据vscode 的提示安装了一些不知道干啥的插件,编写过程中提示说 "Linter pylint is not install ...
- javascript判断智能终端信息
< script type = "text/javascript" > /* * 智能机浏览器版本信息: * */ var browser = { versions: ...
- Spring Boot从入门到实战:整合Web项目常用功能
在Web应用开发过程中,一般都涵盖一些常用功能的实现,如数据库访问.异常处理.消息队列.缓存服务.OSS服务,以及接口日志配置,接口文档生成等.如果每个项目都来一套,则既费力又难以维护.可以通过Spr ...
- canvas drawImage方法不显示图片的解决方案
先复习一下用法: context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height); 各个参数说明: 参数 描述 img 规定要使用的图像.画布 ...
- Linux下实现RAID
一.实验目的 1.掌握Linux系统下软RAID的实现方法: 2.掌握RAID5的配置过程: 3. 通过实验熟悉RAID.5的特点. 二.实验内容及步骤 1.在VMware中创建一台Linux. 2. ...
- (个人开源)ffpanel --ffmpeg的GUI,让ffmpeg离开黑黑的命令行
程序及源代码下载地址 :https://github.com/langsim/ffpanel
- 图像处理之基础---二维卷积c实现
http://wenku.baidu.com/link?url=4RzdmvP9sdaaUbnVEW4OyBD-g67wIOiJjKFF3Le_bu7hIiBS7I6hMcDmCXrQwsHvrsPv ...