标签:Educational Contest ll 状压 long 选取 Matching dp
O - Matching
原题链接:https://atcoder.jp/contests/dp/tasks/dp_o
题目大意:
有n个男人,n个女人,然后一男一女组合,其中一个二维矩阵a[i][j]记录第i个男人,与第j个女人能不能组合,求有多少种组合方式。
解题思路:
状压dp:用一个n为二进制的整数来表示n个人的选取状态,从0开始然后判断是否可选取第i位,可选取那位便加1,如到001,010,100,然后继续遍历。
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define debug(a) cout<<#a<<":"<<a<<endl; 5 const ll INF=0x3f3f3f3f; 6 const ll N=4e6+7; 7 const ll mod=1e9+7; 8 ll maxn,minn; 9 ll T,n,m; 10 ll mp[100][100]; 11 ll dp[N]; 12 13 int main(){ 14 cin>>n; 15 for(ll i=0;i<n;i++){ 16 for(ll j=0;j<n;j++){ 17 scanf("%lld",&mp[i][j]); 18 } 19 } 20 dp[0]=1; 21 for(ll i=0;i<(1<<n);i++){ 22 ll num=0; 23 for(ll j=0;j<n;j++){ 24 if((i>>j)&1){ 25 num++; 26 } 27 } 28 for(ll j=0;j<n;j++){ 29 if(mp[num][j]==1&&((1<<j)^i)!=i){ 30 dp[(1<<j)^i]=(dp[(1<<j)^i]+dp[i])%mod; 31 } 32 } 33 } 34 cout<<dp[(1<<n)-1]<<endl; 35 return 0; 36 }
标签:Educational,Contest,ll,状压,long,选取,Matching,dp 来源: https://www.cnblogs.com/meanttobe/p/12852920.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。