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
原文地址:https://www.cnblogs.com/ctyakwf/p/13512266.html