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表示違背了的條件個數。
然後列舉隊頭的是哪個人,計算出插入他前的狀態las
tlast
last
和將他插入隊頭會違背的條件個數nok
nokno
k。動態轉移fi,
j+=f
last
,j−n
ok
f_+=f_
fi,j+
=fla
st,j
−nok
#include
#define n 21
using
namespace std;
const
int xjq=
1e9+7;
int n,m,k,atk[n]
,f[1
<[n],ans,ms;
intcount_one
(int x)
return ans;
}int
main()
ms=1<[0]=
1;for(
int i=
0;i)for
(int j=
0;j((i>>j)&1
)for
(int i=
0;i<=k;i++
) ans=
(ans+f[ms-1]
[i])
%xjq;
printf
("%d"
,ans)
;}
JZOJ 5230 隊伍統計 狀壓dp
現在有n個人要排成一列,編號為1 n 但由於一些不明原因的關係,人與人之間可能存在一些矛盾關係,具體有m條矛盾關係 u,v 表示編號為u的人想要排在編號為v的人前面。要使得隊伍和諧,最多不能違背k條矛盾關係 即不能有超過k條矛盾關係 u,v 滿足最後v排在了u前面 問有多少合法的排列。答案對10 9...
Jzoj5230 隊伍統計
現在有n個人要排成一列,編號為1 n 但由於一些不明原因的關係,人與人之間可能存在一些矛盾關係,具體有m條矛盾關係 u,v 表示編號為u的人想要排在編號為v的人前面。要使得隊伍和諧,最多不能違背k條矛盾關係 即不能有超過k條矛盾關係 u,v 滿足最後v排在了u前面 問有多少合法的排列。答案對10 9...
jzoj 5230 隊伍統計 狀態壓縮DP
description 現在有n個人要排成一列,編號為1 n 但由於一些不明原因的關係,人與人之間可能存在一些矛盾關係,具體有m條矛盾關係 u,v 表示編號為u的人想要排在編號為v的人前面。要使得隊伍和諧,最多不能違背k條矛盾關係 即不能有超過k條矛盾關係 u,v 滿足最後v排在了u前面 問有多少合...