牛客练习赛69D-火柴排队【dp】
生活随笔
收集整理的這篇文章主要介紹了
牛客练习赛69D-火柴排队【dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://ac.nowcoder.com/acm/contest/7329/D
題目大意
nnn個數的序列,排序后讓隨機kkk個數加上ddd,求依舊滿足單調上升的期望概率
解題思路
對于一個位置加上ddd后會讓到后面一段范圍內都得加上ddd。我們預處理一個lil_ili?表示如果iii加上ddd后[i+1,li][i+1,l_i][i+1,li?]都得加上ddd。
然后設fi,jf_{i,j}fi,j?表示到第iii個加了kkk次依舊滿足條件的方案數。
然后O(n2)dpO(n^2)dpO(n2)dp即可
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const int N=5100,XJQ=998244353; int n,d,l[N],a[N],f[N][N],c[N][N]; int power(int x,int b){int ans=1;while(b){if(b&1)ans=(ll)ans*x%XJQ;x=(ll)x*x%XJQ;b>>=1;}return ans; } int main() {scanf("%d%d",&n,&d);for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+1+n); for(int i=n;i>=1;i--){int z;l[i]=i;for(z=i;z<=n&&a[i]+d>=a[z];z++);z--;l[i]=l[z];}f[1][0]=c[0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<n;j++){int w=l[i]-i+1;(f[l[i]+1][j+w]+=f[i][j])%=XJQ;(f[i+1][j]+=f[i][j])%=XJQ;}}for(int i=1;i<=n+1;i++)for(int j=1;j<=n+1;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%XJQ;for(int i=1;i<=n;i++)printf("%d\n",(ll)f[n+1][i]*power(c[n+1][i+1],XJQ-2)%XJQ); } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的牛客练习赛69D-火柴排队【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nssl1519-背包签到题【数论】
- 下一篇: P4213-[模板]杜教筛(Sum)