ZOJ 3329 - One Person Game
题意:每次筛三个骰子面分别为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]和E[i+k]有关, E[0]是E[i]的先前结点,而E[i+k]是E[i]的后置结点,因此无法使用DP解决这个问题。我们考虑消去一个变量,这里只有最后的结点E[n]是已知的,所以我们可以消去后置结点E[i+k]。这样假设E[i]=A[i]*E[0]+B[i],代入E[i+k],可得E[i]=sum{Pk*(A[i+k]*E[0]+B[i+k])}+1/(k1*k2*k3)*E[0]+1,进一步得E[i]=(sum{Pk*A[i+k]}+1/(k1*k2*k3))*E[0]+sum{Pk}*B[i+k]+1。
这样对应系数可得到A[i]=sum{Pk*A[i+k]}+1/(k1*k2*k3),B[i]=sum{Pk}*B[i+k]+1。
我们知道E[n]=0,所以A[n]=0,B[n]=0。
这样可以递推求出所有A[i]和B[i],这样也就能算出所有的E[i]了。
最终答案是E[0]。E[0]=A[0]*E[0]+B[0],所以E[0]=B[0]/(1-A[0])。
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <queue> #include <algorithm> #define ll long long #define MAXN 30005 using namespace std; ],B[]; ]; int main() { int T; scanf("%d",&T); while(T--) { int n,k1,k2,k3,a,b,c; scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c); double r=1.0/(k1*k2*k3); memset(A,,sizeof(A)); memset(B,,sizeof(B)); memset(pro,,sizeof(pro)); ; i<=k1; ++i) ; j<=k2; ++j) ; k<=k3; ++k) if(!(i==a&&j==b&&k==c)) pro[i+j+k]+=r; int s=k1+k2+k3; ; --i) { ; j<=s; ++j) { A[i]+=pro[j]*A[i+j]; B[i]+=pro[j]*B[i+j]; } A[i]+=r; B[i]++; } printf(]/(-A[])); } ; }
ZOJ 3329 - One Person Game的更多相关文章
- 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< ...
- ZOJ 3329 One Person Game (经典概率dp+有环方程求解)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3329 题意:现在有三个骰子,分别有k1,k2和k3面,面上的点就是1~ki ...
- ZOJ 3329 One Person Game:期望dp【关于一个点成环——分离系数】
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3329 题意: 给你面数分别为k1,k2,k3的三个骰子. 给定a ...
- ZOJ 3329 One Person Game 概率DP 期望 难度:2
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754 本题分数为0的概率不确定,所以不能从0这端出发. 设E[i]为到达成功所 ...
- ZOJ 3329 【概率DP】
题意: 给你三个均匀k面筛子. 分别有k1 k2 k3个面,每个面朝上的概率是相等的. 如果第一个筛子出现a第二个筛子出现b第三个筛子出现c那么置零. 否则在当前和加上三个点数之和. 求当前和大于n需 ...
- zoj 3329 One Person Game (有环 的 概率dp)
题目链接 这个题看的别人的思路,自己根本想不出来这种设方程的思路. 题意: 有三个骰子,分别有k1,k2,k3个面. 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和. 当 ...
- 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]= ...
- ZOJ 3329 One Person Game 带环的概率DP
每次都和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+ ...
- ZOJ 3329 One Person Game 【概率DP,求期望】
题意:有三个骰子,分别有k1,k2,k3个面. 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和. 当分数大于n时结束.求游戏的期望步数.初始分数为0 设dp[i]表示达到 ...
随机推荐
- iOS 使用drawRect: 绘制虚线椭圆
iOS 使用drawRect: 绘制虚线椭圆 1:首先如果要使用 drawRect 绘图 要导入 CoreGraphics.framework 框架 然后 创建 自定义view, 即是 myView继 ...
- 使用委托(C# 编程指南)
原文地址:https://msdn.microsoft.com/zh-cn/library/ms173172.aspx 委托是安全封装方法的类型,类似于 C 和 C++ 中的函数指针. 与 C 函数 ...
- Django数据库设置
设置数据库,创建您的第一个模型,得到一个简单介绍 Django的自动生成管理网站. 数据库设置 现在,打开 mysite / settings.py . 这是一个普通的Python模块 模块级变量代表 ...
- 1029c语言文法2理解
program → external_declaration | program external_declaration <程序>→ <外部声明>|<程序>< ...
- 笔记9:winfrom的一些知识点(二)
一.新建,和删除文件夹 private void button4_Click(object sender, EventArgs e) { Directory.Delete(@"F:\&quo ...
- exit(0)和exit(1)区别
exit(0):正常退出程序: exit(1):非正常退出程序: return:返回. return是语言级别的,表示调用堆栈的返回: exit是系统调用级别的,表示一个进程的退出.
- linux下git的安装和使用(转)
转自:http://www.cnblogs.com/sunada2005/archive/2013/06/06/3121098.html 最近在使用github,感觉不错.在windows下,可使用g ...
- OUT函数及其熟练使用,split的用法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Anysys Fluent安装教程
按顺序按照在一个文件夹内D:\Anysys Fluent 1:安装Exceed 调整电脑时间至2005年(前辈经验) 点击解压好的Exceed.13.[x86+x64]文件夹中的M ...
- mvc+ef中比较数据
例如:根据Para表中的type和paraid 字段进行比较 public class TypeComparer : IEqualityComparer<Para> { bool IEqu ...