日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[集训队作业2018]小Z的礼物(min-max容斥,插头dp)

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [集训队作业2018]小Z的礼物(min-max容斥,插头dp) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳送門

  • 這種求 “取到所有物品的期望時間” 的題一般都用 min?maxmin-maxmin?max容斥 解決:
    t(i,j)t(i,j)t(i,j)為取到格子(i,j)(i,j)(i,j)的期望時間,集合S=∪c(i,j)=′?′{t(i,j)}S=\cup_{c(i,j)='*'}\{t(i,j)\}S=c(i,j)=??{t(i,j)}
    那么根據min?maxmin-maxmin?max容斥有:max?(S)=∑T?S,T≠?(?1)∣T∣?1min?(T)\max(S) = \sum_{T\subseteq S, T \neq \varnothing} (-1)^{|T|-1}\min(T)max(S)=T?S,T?=??(?1)T?1min(T)

  • min(T)min(T)min(T)即為首次取到TTT中的格子的期望時間(記為ETE_TET?),考慮轉成求概率:
    PTP_{T}PT?為取到TTT中的格子的概率,由ET=1+(1?PT)ETE_{T}=1+(1-P_T)E_TET?=1+(1?PT?)ET?解得ET=1PTE_T=\frac{1}{P_T}ET?=PT?1?
    設有覆蓋到TTT中的格子的相鄰對個數為xxx,因為總共的相鄰對個數為m(n?1)+n(m?1)m(n-1)+n(m-1)m(n?1)+n(m?1),所以PT=xm(n?1)+n(m?1)P_T=\frac{x}{m(n-1)+n(m-1)}PT?=m(n?1)+n(m?1)x?,得到ET=m(n?1)+n(m?1)xE_T=\frac{m(n-1)+n(m-1)}{x}ET?=xm(n?1)+n(m?1)?

  • 發現子集TTT數量很多,但是xxx非常小,于是神奇地轉換思路:
    求出對于每個xxx,有多少個子集TTT滿足恰有xxx個相鄰對有覆蓋到TTT中的點。
    上插頭dp,設dp[i][j][s][x]dp[i][j][s][x]dp[i][j][s][x]表示做到了(i,j)(i,j)(i,j),當前狀態為sss,有xxx個相鄰對。
    我們dp的內容是系數和,如果選了一個格子,集合大小改變,要乘一個?1-1?1作為系數。

#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int mod=998244353; int add(int a,int b){return a+b>=mod?a+b-mod:a+b;} int dec(int a,int b){return a<b?a-b+mod:a-b;} int mul(int a,int b){return 1ll*a*b%mod;} void Add(int &a,int b){a=add(a,b);} int ksm(int a,int b){int res=1;while(b){if(b&1) res=mul(res,a);b>>=1;a=mul(a,a);}return res; } int n,m; char c[10][110]; int dp[2][1<<6][1250],ans;//N*M*2=1200 int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%s",c[i]+1);int tot=n*(m-1)+m*(n-1);int cur=1,pre=0;dp[cur][0][0]=dec(0,1);int sta=(1<<n)-1;for(int i=1;i<=m;++i){for(int j=1;j<=n;++j){swap(cur,pre);memset(dp[cur],0,sizeof(dp[cur]));for(int s=0;s<=sta;s++){for(int k=0;k<=tot;k++){if(dp[pre][s][k]){int ss=s&(sta^(1<<(j-1)));Add(dp[cur][ss][k],dp[pre][s][k]);if(c[j][i]=='*'){ss|=(1<<j-1);int delta=(i!=1&&(s&(1<<j-1))==0)+(j!=1&&(s&(1<<j-2))==0)+(i<m)+(j<n);Add(dp[cur][ss][k+delta],dec(0,dp[pre][s][k]));}}}}}}for(int i=1;i<=tot;i++){ll inv=ksm(i,mod-2);for(int s=0;s<=sta;s++)Add(ans,mul(dp[cur][s][i],inv));}ans=mul(ans,tot);cout<<ans;return 0; }

參考文章:
https://www.cnblogs.com/ZH-comld/p/11014880.html
https://www.cnblogs.com/huyufeifei/p/10498429.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的[集训队作业2018]小Z的礼物(min-max容斥,插头dp)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。