jzoj 5230 隊伍統計 狀態壓縮DP

2021-09-10 06:55:02 字數 1347 閱讀 1070

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...