博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NOI2017]泳池
阅读量:4694 次
发布时间:2019-06-09

本文共 1754 字,大约阅读时间需要 5 分钟。

题目描述

有一个长为\(n\),高为1001的网格,每个格子有\(p\)的概率为1,\((1-p)\)的概率0,定义一个网格的价值为极大的全一矩形,且这个矩形的底要贴着网格的底,求这个网格的价值为\(K\)的概率。

题解

我们可以考虑设一个\(dp\)

我们定义每一列的高度为这一列最高的位置满足这个位置及以下的位置都为1。

\(dp[i][j]\)表示已经做到了前\(i\)列,此时最低的位置为\(j\)并且此时的最大价值不超过\(K\)的概率。

可以看出这是一个前缀和的形式,我们需要在最外面用\(K\)的答案减去\(K-1\)的答案来得到最终的答案。

那么我们的\(dp\)转移可以枚举最靠前的一列满足\(j+1\)处是0的列。

那么转移为:

\(dp[i][j]=[i\times j\leq K](1-p)p^j\sum_{x=1}^i\Bigl( (\sum_{k\geq j+1}dp[x-1][k])\times(\sum_{l\geq j}dp[i-x][l])\Bigr)\)

我们要求的答案为\(dp[n][0]\)

后面的两个求和部分可以发现是一个后缀和形式,考虑用后缀和优化转移。

比如说我们已经算完了等号右边的部分,我们可以把它加到\(dp[i][l](l\leq j)\)就可以了。

前面枚举\(i\),然后枚举\(K/i\),再去枚举\(i\),总的复杂度为\(K^2\)

我们发现\(n​\)非常大,所以我们需要发现一些别的性质。

发当\(n\geq k\)时,第二维只能为0,所以我们令\(g[n]=dp[n][0]\)

\[ g[n]=(1-p)\sum_{i=1}^{i\leq K+1}dp[i-1][1]\times g[n-i] \]

\[ g[n]=\sum_{i=1}^{i\leq K+1}(dp[i-1][1]\times (1-p))\times g[n-i] \]

这样我们把它转化为一个\(K+1\)次的常系数齐次线性递推。

可以用矩阵乘法优化为\(O(K^3logn)\),期望得分90,使用多项式取模可以优化至\(O(K^2logn)\sim(KlogKlogn)\)期望得分100。

注意特判\(K=0\)

代码

#include
#include
#include
#define N 1009using namespace std;typedef long long ll;const int mod=998244353;int pos,k,n;ll tmp[N<<1],p[N],dp[N][N],P,y,now[N],num[N],ans[N];inline ll rd(){ ll x=0;char c=getchar();bool f=0; while(!isdigit(c)){if(c=='-')f=1;c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return f?-x:x;}inline ll power(ll x,ll y){ ll ans=1; while(y){if(y&1)ans=ans*x%mod;x=x*x%mod;y>>=1;} return ans;}inline void MOD(ll &x){while(x>=mod)x-=mod;}inline void mul(ll *a,ll *b,ll *c){ for(int i=0;i<=2*pos;++i)tmp[i]=0; for(int i=0;i
=pos;--i){ for(int j=0;j
>=1; } ll res=0; for(int i=0;i

转载于:https://www.cnblogs.com/ZH-comld/p/10461183.html

你可能感兴趣的文章
我的VS CODE插件配置 主要针对.NET和前端插件配置
查看>>
关于js中的事件
查看>>
一致性哈希算法运用到分布式
查看>>
决策树和随机森林->信息熵和条件熵
查看>>
iOS10 UI教程视图和子视图的可见性
查看>>
Maven学习笔记
查看>>
FindChildControl与FindComponent
查看>>
1、简述在java网络编程中,服务端程序与客户端程序的具体开发步骤?
查看>>
C# Web版报表
查看>>
中国城市json
查看>>
LeetCode OJ 238. Product of Array Except Self 解题报告
查看>>
使用外网访问阿里云服务器ZooKeeper
查看>>
Java代码检查工具
查看>>
深入了解VC++编译器【转】
查看>>
响应式图片
查看>>
如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion
查看>>
iOS音频播放(一):概述
查看>>
Android之使用AchartEngineActivity引擎绘制柱状图、曲线图
查看>>
android对象巧用Android网络通信技术,在网络上直接传输对象
查看>>
android下载手动下载Android SDK
查看>>