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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【状压DP】滚榜(P7519)

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【状压DP】滚榜(P7519) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

P7519


題目大意

n個隊伍,排名先按分數排序再按編號排序,每個隊伍有一個初始分數 aia_iai?,和一個附加分數 bib_ibi?

對于一個合法的 bib_ibi? 序列,按 bib_ibi? 大小排序,從小到大把每個 bib_ibi? 加進對應的 aia_iai? 中,且每個 bib_ibi? 加入后對應的點會成為排名第一的點

現在告訴你所有 bib_ibi? 的和 m,問你對于所有合法的 bib_ibi?,最后的排名有多少種


解題思路

考慮狀壓DP,設 fS,i,j,kf_{S,i,j,k}fS,i,j,k? 為當前所有點是否添加的狀態為 SSS,最后添加的點為 iiibi=jb_i=jbi?=j,已經加了的 bbb 和為 kkk 的方案數

直接轉移時間復雜度為 O(2nn2m2)O(2^nn^2m^2)O(2nn2m2),會TLE

考慮到答案的計算之和最后的排名有關,也就是和加入 bbb 的順序有關(下文所有順序都是指加入順序中的先后),那么對于一種加入順序,讓所有點的 bib_ibi? 盡量小(除最后一個點)

因為 bib_ibi? 是單調遞增的,所以考慮一個點加入 bib_ibi? 時,讓后面點的 bbb 都加上 bib_ibi?,那么就可以保證 bib_ibi? 是單調遞增的

綜上,可以優化掉最后添加的點 iii 的附加值 bib_ibi?,那么設 fS,i,kf_{S,i,k}fS,i,k? 表示狀態為S,最后添加的點為 iiibib_ibi? 的和為 kkk ,然后直接轉移即可

時間復雜度 O(2nn2m)O(2^nn^2m)O(2nn2m),因為很多狀態都跑不到,所以實際上能過


code

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 14 using namespace std; ll n,m,mx,sum,ans,a[N],f[1<<N][N][505]; int main() {scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;++i){scanf("%lld",&a[i]);if(a[i]>a[mx])mx=i;}f[0][mx][0]=1;//要保證第一個點加到比最大的點大for(ll S=0;S<(1<<n)-1;++S){sum=0;for(ll i=1;i<=n;++i)if(!(S&(1<<i-1)))sum++;//計算后面有多少個點for(ll k=0;k<=m;++k)for(ll i=1;i<=n;++i) if(f[S][i][k])for(ll j=1;j<=n;++j)if(!(S&(1<<j-1)))if(k+sum*max(a[i]-a[j]+(j>i),0ll)<=m)f[S|(1<<j-1)][j][k+sum*max(a[i]-a[j]+(j>i),0ll)]+=f[S][i][k];}for(ll i=1;i<=n;++i)for(ll j=0;j<=m;++j)//多出來的部分放到最后一個點ans+=f[(1<<n)-1][i][j];printf("%lld",ans);return 0; }

總結

以上是生活随笔為你收集整理的【状压DP】滚榜(P7519)的全部內容,希望文章能夠幫你解決所遇到的問題。

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