zoukankan      html  css  js  c++  java
  • 【BZOJ1306】[CQOI2009]循环赛(搜索)

    【BZOJ1306】[CQOI2009]循环赛(搜索)

    题面

    BZOJ
    洛谷

    题解

    爆搜一下,(hash)记录是否已经考虑过这个状态,记忆化解决问题。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<map>
    using namespace std;
    #define ll long long
    #define MOD 1000000007
    map<ll,int> M;
    inline int read()
    {
    	int x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    int n,a[15],ans,b[15];
    ll dfs(int x,int y)
    {
    	if(a[x]>(x-y)*3)return 0;
    	int ret=0;ll hs=0;
    	if(x==y)
    	{
    		if(x==1)return 1;
    		for(int i=1;i<x;++i)b[i]=a[i];
    		hs=x-1;sort(&b[1],&b[x]);
    		for(int i=1;i<x;++i)hs=hs*25+b[i];
    		return M.find(hs)!=M.end()?M[hs]:M[hs]=dfs(x-1,1);
    	}
    	if(a[x]>=3)a[x]-=3,ret=(ret+dfs(x,y+1))%MOD,a[x]+=3;
    	if(a[x]&&a[y])--a[x],--a[y],ret=(ret+dfs(x,y+1))%MOD,++a[x],++a[y];
    	if(a[y]>=3)a[y]-=3,ret=(ret+dfs(x,y+1))%MOD,a[y]+=3;
    	return ret;
    }
    int main()
    {
    	n=read();
    	for(int i=1;i<=n;++i)a[i]=read();
    	sort(&a[1],&a[n+1]);reverse(&a[1],&a[n+1]);
    	ll ans=dfs(n,1);
    	cout<<ans<<endl;
    	return 0;	
    }
    
  • 相关阅读:
    28
    27
    26
    25
    24
    23
    17
    16
    15
    14
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9743510.html
Copyright © 2011-2022 走看看