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;
}
posted @ 2020-01-21 16:38  Shiina_Mashiro  阅读(183)  评论(0编辑  收藏  举报