当前位置: 首页 > news >正文

ZOJ 3329 One Person Game

期望,$dp$。

设$dp[i]$为目前和为$i$,到达目标状态需要的期望次数。$dp[i]=sum(dp[i+j]*p[j])+dp[0]/(k1*k2*k3)+1$。

无奈,接下来不知所措。去高斯消元了,妥妥的超时......

最终看了大佬博客。发现有一个骚操作。

设$dp[i]=A[i]*dp[0]+B[i]$,如果知道$A[i]$与$B[i]$,那么$dp[0]=B[0]/(1-A[0])$。

$dp[i+j]=A[i+j]*dp[0]+B[i+j]$。

$dp[i]=sum(A[i+j]*dp[0]*p[j]+B[i+j]*p[j])+dp[0]/(k1*k2*k3)+1$。

所以,$A[i]=sum(A[i+j]*p[j])+p[0]$,$B[i]=sum(B[i+j]*p[j])+1$。

$A$和$B$倒着推一下就可以知道了。 真*智商捉急。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-6;
void File()
{
    freopen("D:\\in.txt","r",stdin);
    freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
    char c = getchar();
    x = 0;
    while(!isdigit(c)) c = getchar();
    while(isdigit(c))
    {
        x = x * 10 + c - '0';
        c = getchar();
    }
}

int T,n,k1,k2,k3,a,b,c;
int f[20];
double A[505],B[505];

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c);

        memset(f,0,sizeof f);
        for(int i=1; i<=k1; i++)
            for(int j=1; j<=k2; j++)
                for(int s=1; s<=k3; s++) f[i+j+s]++;
        f[a+b+c]--;

        for(int i=n;i>=0;i--)
        {
            A[i]=1.0/(k1*k2*k3);
            B[i]=1.0;
            for(int j=1;j<=k1+k2+k3;j++)
            {
                if(i+j>n) break;
                A[i]=A[i]+A[i+j]*f[j]/(k1*k2*k3);
                B[i]=B[i]+B[i+j]*f[j]/(k1*k2*k3);
            }
        }

        printf("%.8f\n",B[0]/(1-A[0]));
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/zufezzt/p/6298395.html

相关文章:

  • pyinstall tkinter image
  • CSS快速入门
  • 强力优化Rancher k8s中国区的使用体验
  • Windows 8 Platform (三) Windows 8 Developer Preview
  • 关于责任和业务(r11笔记第60天)
  • 如何测试网页登录
  • C#分部类型解析
  • 博为峰Java技术文章 ——JavaSE Swing JTabbedPane选项卡面板II
  • JS 设置盒子div 跳转
  • 数组操作函数总结
  • 在Unity(C#)下实现Lazy Theta*寻路
  • 双显卡笔记本安装CUDA+theano、tensorflow环境
  • Zabbix3.x 服务安装、配置及常见问题处理
  • Material Design学习之 Camera
  • Perl 获得当前路径
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Android 架构优化~MVP 架构改造
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • mongodb--安装和初步使用教程
  • Python 反序列化安全问题(二)
  • 闭包,sync使用细节
  • 多线程事务回滚
  • 浮现式设计
  • 计算机在识别图像时“看到”了什么?
  • 判断客户端类型,Android,iOS,PC
  • 配置 PM2 实现代码自动发布
  • 思考 CSS 架构
  • 突破自己的技术思维
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 终端用户监控:真实用户监控还是模拟监控?
  • Hibernate主键生成策略及选择
  • raise 与 raise ... from 的区别
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • # include “ “ 和 # include < >两者的区别
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (python)数据结构---字典
  • (windows2012共享文件夹和防火墙设置
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (一)SpringBoot3---尚硅谷总结
  • (转)socket Aio demo
  • (转)Windows2003安全设置/维护
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net core控制台应用程序初识
  • .net web项目 调用webService
  • .Net程序帮助文档制作
  • .NET企业级应用架构设计系列之结尾篇
  • .NET设计模式(2):单件模式(Singleton Pattern)