LOJ6043 「雅礼集训 2017 Day7」蛐蛐国的修墙方案

Link
可以发现这张图一定是由若干个偶环构成,直接枚举的复杂度是(O(2^{frac n2}))的。
当环的大小为(2)时,在左边放左括号一定不劣,所以只需要考虑所有大小(ge4)的环即可,时间复杂度为(O(2^{frac n4}))

#include<cstdio>
#include<cstdlib>
int n,p[105],q[105];char s[105];
void dfs(int x,int f)
{
    if(f<0) return;
    if(s[x]) return dfs(x-1,f+(s[x]=='('?-1:1));
    if(!x) puts(s+1),exit(0);
    if(x>p[x]&&!s[x]&&!s[p[x]]) s[x]='(',s[p[x]]=')',dfs(x-1,f-1),s[x]=s[p[x]]=0;
    if(x>q[x]&&f<x&&!s[x]&&!s[q[x]]) s[q[x]]='(',s[x]=')',dfs(x-1,f+1),s[x]=s[q[x]]=0;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)if(scanf("%d",p+i),i<p[i])q[p[i]]=i;
    return dfs(n,0),0;
}
原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12222274.html