• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > ZOJ 3329 One Person Game (期望DP)

ZOJ 3329 One Person Game (期望DP)

作者:w4149 字体:[增加 减小] 来源:互联网 时间:2017-08-27

w4149通过本文主要向大家介绍了zoj,期望dp等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

There is a very simple and interesting one-person game. You have 3 dice, namely Die1, Die2 and Die3. Die1 has K1 faces. Die2 has K2 faces. Die3 has K3 faces. All the dice are fair dice, so the probability of rolling each value, 1 to K1, K2, K3 is exactly 1 / K1, 1 / K2 and 1 / K3. You have a counter, and the game is played as follow:
1.Set the counter to 0 at first.
2.Roll the 3 dice simultaneously. If the up-facing number of Die1 is a, the up-facing number of 3.Die2 is b and the up-facing number of Die3 is c, set the counter to 0. Otherwise, add the counter by the total value of the 3 up-facing numbers.
If the counter’s number is still not greater than n, Go to step 2. Otherwise the game is ended.
Calculate the expectation of the number of times that you cast dice before the end of the game.

Input

There are multiple test cases. The first line of input is an integer T (0 < T <= 300) indicating the number of test cases. Then T test cases follow. Each test case is a line contains 7 non-negative integers n, K1, K2, K3, a, b, c (0 <= n <= 500, 1 < K1, K2, K3 <= 6, 1 <= a <= K1, 1 <= b <= K2, 1 <= c <= K3).

Output

For each test case, output the answer in a single line. A relative error of 1e-8 will be accepted.

Sample Input

2
0 2 2 2 1 1 1
0 6 6 6 1 1 1

Sample Output

1.142857142857143
1.004651162790698

题目大意:有三个骰子,分别有k1,k2,k3个面。
每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和。
当分数大于n时结束。求游戏的期望步数。初始分数为0

思路:
<摘自onepointo>
设dp[i]表示达到i分时到达目标状态的期望,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];
可以发现当i==0时,dp[0]=B[0]/(1−A[0]);
代入上述方程右边得到:
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]=∑(pk∗B[i+k])+1
先递推求得A[0]和B[0].
那么 dp[0]=B[0]/(1−A[0]);

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 510;

double A[N], B[N];
double p[100];
int n, k1, k2, k3, a, b, c;

void init(){
    memset(p, 0, sizeof( p ));
    memset(A, 0, sizeof( A ));
    memset(B, 0, sizeof( B ));
}

int main(){
    int T; scanf("%d", &T);
    while( T-- ){
        init();
        scanf("%d%d%d%d%d%d%d", &n, &k1, &k2, &k3, &a, &b, &c);
        double p0 = 1.0 / k1 / k2 / k3;
        for(int i=1; i<=k1; ++i)
            for(int j=1; j<=k2; ++j)
                for(int k=1; k<=k3; ++k){
                    if(i != a || j != b || k != c) p[i+j+k] += p0;//
                }
        for(int i=n; i>=0; --i){
            A[i] = p0; B[i] = 1;
            for(int j=1; j<=k1+k2+k3; ++j){
                A[i] += A[i+j] * p[j];
                B[i] += B[i+j] * p[j];
            }
        }
        printf("%.16lf\n", B[0] / (1 - A[0]));
    }
    return 0;
}
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ZOJ 3329 One Person Game (期望DP)

相关文章

  • 2017-05-28解析C++中派生的概念以及派生类成员的访问属性
  • 2017-08-27最长公共子序列LCS C++实现
  • 2017-05-28C++模板类的用法实例
  • 2017-05-28详解C语言中getgid()函数和getegid()函数的区别
  • 2017-05-28C++中“#”号的使用技巧
  • 2017-05-28C语言实现返回字符串函数的四种方法
  • 2017-05-28C++实现打印1到最大的n位数
  • 2017-05-28浅谈VS中添加头文件时显示无法找到文件的问题
  • 2017-05-28简单解读C++中的虚函数
  • 2017-05-28C++中一维数组与指针的关系详细总结

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C/C++中宏定义(#define)
    • C++操作MySQL大量数据插入效率低下的解决方法
    • C++求逆序对的方法
    • c++中临时变量不能作为非const的引用参数的方法
    • C语言的fork函数在Linux中的进程操作及相关面试题讲解
    • 大数据情况下桶排序算法的运用与C++代码实现示例
    • C++之CWnd窗口框架实例
    • C++读写Excel的实现方法详解
    • C++中vector容器的用法
    • 深入探讨:linux中遍历文件夹下的所有文件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有