description
現在有n個人要排成一列,編號為1->n 。但由於一些不明原因的關係,人與人之間可能存在一些矛盾關係,具體有m條矛盾關係(u,v),表示編號為u的人想要排在編號為v的人前面。要使得隊伍和諧,最多不能違背k條矛盾關係(即不能有超過k條矛盾關係(u,v),滿足最後v排在了u前面)。問有多少合法的排列。答案對10^9+7取模。
input
輸入檔名為count.in。
第一行包括三個整數n,m,k。
接下來m行,每行兩個整數u,v,描述乙個矛盾關係(u,v)。
保證不存在兩對矛盾關係(u,v),(x,y),使得u=x且v=y 。
output
輸出檔名為count.out。
輸出包括一行表示合法的排列數。
f i,
jf_
fi,j
表示i
ii表示狀態,j
jj表示違背了的條件個數。
我們可以列舉隊頭,算出插入隊頭前的狀態las
tlast
last
和將插入隊頭後會違背的條件個數fla
gflag
flag
(即判斷狀態裡有多少個一)。
可以這麼處理:
int
find
(int x)
動態轉移方程為:fi,
j+=f
last
,j−f
la
gf_+=f_
fi,j+
=fla
st,j
−fla
g
#include
#include
#define rep(i,x,y) for (register int i=x;i<=y;i++)
#define fre(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
#define n 21
using
namespace std;
const
int pe=
1e9+7;
int n,m,k,f[
1<[n],ans,a[n]
,cnt,last,flag;
intfind
(int x)
intmain()
rep(i,
0,k)
(ans+
=f[cnt-1]
[i])
%=pe;
printf
("%d"
,ans)
;}
Jzoj5230 隊伍統計
現在有n個人要排成一列,編號為1 n 但由於一些不明原因的關係,人與人之間可能存在一些矛盾關係,具體有m條矛盾關係 u,v 表示編號為u的人想要排在編號為v的人前面。要使得隊伍和諧,最多不能違背k條矛盾關係 即不能有超過k條矛盾關係 u,v 滿足最後v排在了u前面 問有多少合法的排列。答案對10 9...
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
現在有n個人要排成一列,編號為1 n 但由於一些不明原因的關係,人與人之間可能存在一些矛盾關係,具體有m條矛盾關係 u,v 表示編號為u的人想要排在編號為v的人前面。要使得隊伍和諧,最多不能違背k條矛盾關係 即不能有超過k條矛盾關係 u,v 滿足最後v排在了u前面 問有多少合法的排列。答案對10 9...