zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    qt捕鱼达人
    linux通过源码安装gdb
    打造简易http服务器
    linux缓存同步
    NOI之后的碎碎念
    Validate至少有一个不能为空
    IOI 2020 集训队作业
    P6033 [NOIP2004 提高组] 合并果子 加强版 题解
    P3017 [USACO11MAR]Brownie Slicing G 题解
    LOJ #145. DFS 序 2 题解
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13512266.html
Copyright © 2011-2022 走看看