2021.2.17动态规划基础测试T2

T2配对

题目描述
有N个编号1,2…,N的男人和有1,2…N个编号的女人。
对于每个 i,j(1 ≤ \leq i , j ≤ \leq N) 男人i和女人j的匹配度是一个整数。当a[i][j]==1时,男人i和女j可以匹配。当a[i][j]==0时。两人不匹配。芋头正在尝试配出N对一男一女的配对。其中,每个男人和每个女人都必须且只能属于某一个配对。
请计算出芋头配出N对的方案数对 1 0 9 + 7 10^9+7 109+7 取模的结果。
输入格式
输入一个数字N。
接下来N行,第i行有N个空格隔开的数a[i][1]到a[i][N]。
输出格式

输出芋头配出N对方案数对 1 0 9 + 7 10^9+7 109+7 取模的结果

数据范围与提示

1 ≤ N ≤ 21 1 \leq N \leq 21 1N21
a [ i ] [ j ] a[i][j] a[i][j] 0 0 0 1 1 1

样例
输入样例1

3
0 1 1
1 0 1
1 1 1

输出格式

3

输入格式2

4 
0 1 0 0 
0 0 0 1 
1 0 0 0 
0 0 1 0

输出格式2

1

输入格式3

1
0

输出样例3

0

输入样例4

21
0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 1 
1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 1 0 
0 0 1 1 1 1 0 1 1 0 0 1 0 0 1 1 0 0 0 1 1 
0 1 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 
1 1 0 0 1 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 
0 1 1 0 1 1 1 0 1 1 1 0 0 0 1 1 1 1 0 0 1
0 1 0 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 0 1 0
0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1
0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 0 1 0 1 1 1
0 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1
0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0 1 1 0
0 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 0 0 0 0 1
0 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 0 1 0 1 1
1 1 1 1 1 0 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1
0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1
1 0 1 1 0 1 0 1 0 0 1 0 0 1 1 0 1 0 1 1 0
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0 1
0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1
0 0 0 0 1 1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0
1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0
1 0 0 1 1 0 1 1 1 1 1 0 1 0 1 1 0 0 0 0 0

输出格式4

102515160

考场代码

//得分35/100
#include
#define LL long long
using namespace std;
const LL P=1e9+7;
int n,a[30][30],ans=0;
bool yy[30];
void dfs(int x)
{
     
	if(x==n+1)
	{
     
		ans++;
		ans%=P;
		return;
	}
	for(int i=1;i<=n;i++)
	{
     
		if(yy[i]==0&&a[x][i]==1)
		{
     
			yy[i]=1;
			dfs(x+1);
			yy[i]=0;
		}
	}
}
int main()
{
     
	freopen("pair.in","r",stdin);
	freopen("pair.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
     
		for(int j=1;j<=n;j++)
		{
     
			cin>>a[i][j];	
		}
	}
	dfs(1);
	cout<<ans%P<<endl;
	return 0;
 } 

思路
万能的大法师dfs(误) , 观察数据范围可以推测此题为状压dp,利用f[i][j]表示第i个男人,配对的女人的状态为j,每次j行1的个数即为男人的个数。

你可能感兴趣的:(2021.2.17动态规划基础测试T2)