2021.2.17动态规划基础测试T2

该博客探讨了一种使用深度优先搜索(DFS)解决匹配问题的方法。通过输入矩阵表示男性和女性之间的匹配度,程序计算出所有可能的匹配组合,并对结果取模以适应大数运算。题目给出了几个示例输入及对应的输出,包括完全匹配和部分匹配的情况。在样例中,程序实现了DFS的递归解决方案,但可能并不适用于所有规模的数据,暗示可能存在更优的动态规划或位运算解决方案。

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对的方案数对 109+710^9+7109+7 取模的结果。
输入格式
输入一个数字N。
接下来N行,第i行有N个空格隔开的数a[i][1]到a[i][N]。
输出格式

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

数据范围与提示

1≤N≤211 \leq N \leq 211N21
a[i][j]a[i][j]a[i][j]000111

样例
输入样例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<bits/stdc++.h>
#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的个数即为男人的个数。

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值