1. 程式人生 > 實用技巧 >2017ICPC西安 LOL(dfs+剪枝)

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; }
View Code