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;
}