ZOJ 3329 One Person Game:期望dp【关于一个点成环——分离系数】
题目链接: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【关于一个点成环——分离系数】的更多相关文章
- ZOJ 3329 Problem Set (期望dp)
One Person Game There is a very simple and interesting one-person game. You have 3 dice, namely Die1 ...
- ZOJ 3329 One Person Game 概率DP 期望 难度:2
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754 本题分数为0的概率不确定,所以不能从0这端出发. 设E[i]为到达成功所 ...
- 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]= ...
- 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< ...
- poj 2096 , zoj 3329 , hdu 4035 —— 期望DP
题目:http://poj.org/problem?id=2096 题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种: 所以设 f[i][j] 表示已经有几种 ...
- ZOJ 3822 Domination 期望dp
Domination Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showProblem ...
- 成环的概率dp(初级) zoj 3329
原题地址:https://vjudge.net/problem/ZOJ-3329 题目大意: 有三个骰子,分别有k1,k2,k3个面,初始分数是0.第i骰子上的分数从1道ki.当掷三个骰子的点数分别为 ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- [NOIP2016]换教室 D1 T3 Floyed+期望DP
[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...
随机推荐
- grep 精确匹配
使用grep实现精确过滤的五种方法 (1)当被过滤的内容占据一行时 [root@MySQL scripts]# cat oldboy.log 200 0200 2000 [root@My ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- 【强网杯2018】Gamebox
参考: https://www.cnblogs.com/hac425/p/9416787.html http://tacxingxing.com/2018/03/28/2018qwb/ 事后复盘pwn ...
- Struts2实现文件的上传与动态下载功能。
本篇主要使用Struts2实现文件的上传与动态下载功能.出于安全考虑,所以,在硬盘上存储上传的文件的时候,统一都重新命名为随机字符串.用数据库存储真实文件名与随机文件名称之间的关联. 下面的是实体类 ...
- Maven的安装以及在IDEA中的配置
Maven的安装 之前的一篇博客中已经写到过了Maven的安装.这里就只给出链接了. http://www.cnblogs.com/tuhooo/p/5905569.html 版本虽然不同,但是安装的 ...
- Spark源码分析之七:Task运行(一)
在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...
- 【特征匹配】SIFT原理与C源代码剖析
相关: KD树+BBF算法解析 SURF原理与源代码解析 SIFT的原理已经有非常多大牛的博客上做了解析,本文重点将以Rob Hess等人用C实现的代码做解析,结合代码SIFT原理会更easy理解.一 ...
- XMPP资源绑定(Resource Binding)
一个XMPP的账号由三部分组成: 用户名(user/node),域名(domain)和资源(resource) .例如 alice@xmpp.irusher.com/mobile ,user部分(或n ...
- erlang的随机数 及 random:uniform()函数
每次调用会更新进程字典里的random_seed变量,这样在同一个进程内每次调用random:uniform()时,随机数种子都不同,所以生成的随机数都不一样(调用完random:uniform()后 ...
- 【LeetCode从零单排】No.135Candy(双向动态规划)
1.题目 There are N children standing in a line. Each child is assigned a rating value. You are giving ...