狀壓dp JZOJ P3632 舞伴

2021-08-15 05:10:51 字數 1110 閱讀 4053

description

n 個男孩,n 個女孩,男孩和女孩可能是朋友,也可能不是朋友。現在要組成n 對舞伴,要求每對舞

伴都是一男一女,且他們是朋友。

統計不同配對方案的數量,因為結果很大,所以只要求除以m 的餘數。

input

第1 行,2 個整數n,m。接下來n 行,每行n 個整數aij,表示第i 個男孩和第j 個女孩的關係。如果他們是朋友,則aij = 1,否則aij = 0。

output

1 個整數,表示所求的值。

sample input

3 1000000000

1 1 1

1 1 1

1 1 1

sample output

data constraint

• 對於50% 的資料,n <= 9;

• 對於100% 的資料,1 <= n <= 20, 1 <= m <= 10^9; 0 <= aij <= 1。

快速過了一遍題目,瞟了一眼n<=20

咦!完全存得下2^20,然後就走上了一條不歸路

一開始碼題時,怕強行被資料卡不過,小心翼翼的打起來只有一維的方程(設f[x]為當前女生匹配的狀態為x的方案數)

後面越碼越不對勁,想來想去沒有思路怎麼去轉移方程,整個人都虛了

無奈之下。。只好ctrl a+ctrl x,重新推二維的轉移方程

結果,幾下就推出來了,還算了算複雜度發現只是o(n(n+(1<#include

#include

int x,n,m,a[21],two[21],f[2][1

<<20],w,l;

using

namespace

std;

int main()

for(int s=0;sif(f[1^x][s])

for(int j=1;j<=l;j++)

if(!(s&(two[a[j]-1])))

f[x][s|two[a[j]-1]]=(f[x][s|two[a[j]-1]]+f[1^x][s])%m;

}printf("%d",f[x][two[n]-1]);

return

0;}

狀壓dp 玉公尺田 狀壓dp

相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...

狀壓dp小記

鋪磚 題意 現有nm的一塊地板,需要用12的磚塊去鋪滿,中間不能留有空隙。問這樣方案有多少種 include using namespace std typedef long long ll const int maxn 1 11 int n,m,state ll dp 15 maxn s1表示本行...

狀壓dp學習

p2704 炮兵陣地 1038 裁玻璃 狀壓dp是一種非常暴力的做法,列舉所有可能的狀態,找到要求的最佳狀態,與一般dp不同,前一項與後一項有一些複雜的狀態關係。dp的引數 物品個數 行數等 當前狀態 上乙個狀態 將abc的有無表示成乙個8個狀態,列舉所有組,列舉上乙個狀態,得到當前狀態的最優解 i...