【BZOJ1306】[CQOI2009]循環賽(搜索)
阿新 • • 發佈:2018-10-05
ostream get char == sin ans -a 題解 https
【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; }
【BZOJ1306】[CQOI2009]循環賽(搜索)