Jzoj5230 隊伍統計

2022-05-09 15:35:31 字數 791 閱讀 5275

現在有n個人要排成一列,編號為1->n 。但由於一些不明原因的關係,人與人之間可能存在一些矛盾關係,具體有m條矛盾關係(u,v),表示編號為u的人想要排在編號為v的人前面。要使得隊伍和諧,最多不能違背k條矛盾關係(即不能有超過k條矛盾關係(u,v),滿足最後v排在了u前面)。問有多少合法的排列。答案對10^9+7取模。

對應100%的資料,n,k<=20,m<=n*(n-1),保證矛盾關係不重複。

發現資料很小,可以用狀壓dp

我們設f[s][i]表示已經有i對矛盾關係,已經被選的集合為s的方案數

那麼顯然轉移可以用bitset預處理一下

讓後就可以卡過去

#include

#include

#include

#define m 1000000007

using

namespace

std;

int f[1

<<20][21],ans=0;

int n,m,k;

bitset

<21> s[21],p;

inline

void add(int& x,int y)

int main()

f[0][0]=1;

for(int s=0;s<(1

if(f[s][i])

for(int j=0;jif(~s&(1

if(i+t<=k) add(f[s|(1

<1][i]);

printf("%d\n",ans);

}

jzoj5230 隊伍統計 狀壓dp

n nn個人排隊,m mm個條件 u,v u,v u,v 表示u uu要排在v vv前,可以去掉k kk個,求方案總數 考慮依次插入人在隊頭 對於狀態1表示已經在佇列裡,0表示不在 f i,jf fi,j 表示i ii表示狀態,j jj表示違背了的條件個數。然後列舉隊頭的是哪個人,計算出插入他前的狀...

jzoj 5230 隊伍統計 狀態壓縮DP

description 現在有n個人要排成一列,編號為1 n 但由於一些不明原因的關係,人與人之間可能存在一些矛盾關係,具體有m條矛盾關係 u,v 表示編號為u的人想要排在編號為v的人前面。要使得隊伍和諧,最多不能違背k條矛盾關係 即不能有超過k條矛盾關係 u,v 滿足最後v排在了u前面 問有多少合...

JZOJ 5230 隊伍統計 狀壓dp

現在有n個人要排成一列,編號為1 n 但由於一些不明原因的關係,人與人之間可能存在一些矛盾關係,具體有m條矛盾關係 u,v 表示編號為u的人想要排在編號為v的人前面。要使得隊伍和諧,最多不能違背k條矛盾關係 即不能有超過k條矛盾關係 u,v 滿足最後v排在了u前面 問有多少合法的排列。答案對10 9...