ZOJ 3329】的更多相关文章

poj 2096 题目:http://poj.org/problem?id=2096 f[ i ][ j ] 表示收集了 i 个 n 的那个. j 个 s 的那个的期望步数. #include<cstdio> #include<cstring> #include<algorithm> #define db double using namespace std; ; db n,s,f[N][N]; int main() { scanf("%lf%lf"…
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3329 题意:现在有三个骰子,分别有k1,k2和k3面,面上的点就是1~ki.每次扔骰子,如果这三个骰子的值分别对应为a,b,c,那么将值初始化为0,否则就将三个骰子的点值和相加.求大于等于n的扔骰子次数期望. 思路: 这道题目主要在于推公式,看着别人的题解想了好久. 先设$E(i)$为此时和为i时还需要的期望,易得(1):$E(i)=\sum (E(i+k)P(k))+E…
题目链接: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] 刚…
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754 本题分数为0的概率不确定,所以不能从0这端出发. 设E[i]为到达成功所需的步数,明显i>n时E[i]=0,当0<i<=n时E[i]=sigma(E[i+k]*pk)+E[0]*p0,(k是可以投出的除了恰为a,b,c以外的骰子之和), 在这个公式里,E[i]和E[0]都是未知的,设E[0]=x,则 E[i]=sigma(E[i+k]*pk)+x*p0+1, 因…
题意:每次筛三个骰子面分别为k1,k2,k3,如果三个骰子的值分别为a,b,c则得分置0,否则得到分数加上三个骰子的值的和,如果得分大于等于n则结束游戏. 设E[i]表示当前得到i分时结束游戏的期望. 则E[i]=sum{Pk*(E[i+k]+1)|k为三个骰子可能取得的分数且不包括a,b,c这种情况}+1/(k1*k2*k3)(E[0]+1) =sum{Pk*(E[i+k])}+1/(k1*k2*k3)*E[0]+1 这里出现了一个问题,之前的方程都是只与一个方向的有关,而这里E[i]与E[0…
题意: 给你三个均匀k面筛子. 分别有k1 k2 k3个面,每个面朝上的概率是相等的. 如果第一个筛子出现a第二个筛子出现b第三个筛子出现c那么置零. 否则在当前和加上三个点数之和. 求当前和大于n需要的步数的期望. 思路: 一开始状态转移搞错了,手推公式交了WA,后来想了想状态转移的过程发现每个状态都跟0状态有关系,但是dp[0]不确定,但是幸运的是这是一个线性变换,所以状态转移的时候记录一下dp[0]的系数,最后移项输出就好了. dp[i]=dp[i+x]*(k1*k2*k3);(x=i+j…
题目链接 这个题看的别人的思路,自己根本想不出来这种设方程的思路. 题意: 有三个骰子,分别有k1,k2,k3个面. 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和. 当分数大于n时结束.求游戏的期望步数.初始分数为0思路转载自: http://www.cnblogs.com/kuangbin/archive/2012/10/03/2710648.html 分析: 设dp[i]表示达到i分时到达目标状态的期望,pk为投掷k分的概率,p0为回到0的概率 则dp[i]=…
思路:这题的递推方程有点麻烦!! dp[i]表示分数为i的期望步数,p[k]表示得分为k的概率,p0表示回到0的概率: dp[i]=Σ(p[k]*dp[i+k])+dp[0]*p0+1 设dp[i]=A[i]*dp[0]+B[i]带入的: dp[i]=∑(pk*A[i+k]*dp[0]+pk*B[i+k])+dp[0]*p0+1       =(∑(pk*A[i+k])+p0)dp[0]+∑(pk*B[i+k])+1;     明显A[i]=(∑(pk*A[i+k])+p0)     B[i]=…
每次都和e[0]有关系 通过方程消去环 dp[i] = sigma(dp[i+k]*p)+dp[0]*p+1 dp[i] = a[i]*dp[0]+b[i] dp[i] = sigma(p*(a[i+k]*dp[0]+b[i+k]))+dp[0]*p+1 a[i] = sigma(a[i+k]*p)+p b[i] = sigma(b[i+k]*p)+1 #include <cstdio> #include <cstring> using namespace std; double…
题意:有三个骰子,分别有k1,k2,k3个面. 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和. 当分数大于n时结束.求游戏的期望步数.初始分数为0 设dp[i]表示达到i分时到达目标状态(即i = n)的期望,pk为投掷k分的概率, p0为回到0的概率则dp[i] = ∑(pk * dp[i + k]) + dp[0] * p0 + 1 ; 都和dp[0]有关系,而且dp[0]就是我们所求,为常数设 dp[i] = A[i] * dp[0] + B[i]; 即为d…