2017ICPC西安 LOL(dfs+剪枝)
首先要抽象出模型,我们其实只需要管自己选啥英雄就行,因为这是有限制的,其他的直接使用组合数计算之后乘上就行
对于自己选的英雄,有5层,每层100个,最朴素的想法是枚举每人选什么,但是5层for循环超时了,但是4层for循环就很合理
因此我们只枚举前4层,之后看看第五层还能选啥就行。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int inf=0x3f3f3f3f; const int N=2e5+10; const int mod=1e9+7; string s[N]; ll ans; int st[N]; ll tmp; int sum; int dis[N]; void dfs(int u){ int i; if(u==5){ ans=(ans+sum)%mod; for(i=1;i<=4;i++){ if(s[5][dis[i]]=='1') ans--; } ans=(ans+mod)%mod; return ; } for(i=1;i<=100;i++){ if(s[u][i]=='1'&&!st[i]){ st[i]=1; dis[u]=i; dfs(u+1); st[i]=0; } } } int main(){ ios::sync_with_stdio(false); while(cin>>s[1]){ sum=ans=0; s[1]=" "+s[1]; memset(dis,0,sizeof dis); memset(st,0,sizeof st); int i; for(i=2;i<=5;i++){ cin>>s[i]; s[i]=" "+s[i]; } for(i=1;i<=100;i++){ if(s[5][i]=='1') sum++; } dfs(1); cout<<ans*531192758%mod<<endl; } return 0; }
没有人不辛苦,只有人不喊疼