首先,这是一道区间dp题;
首先我们假设 (l) ~ (r) 是一段合法的区间;
考虑状态,对于一个区间 (l) ~ (r) 的方案数,我们需要知道方案数,以及 (l ,r) 未知的两个半括号的颜色;
所以设 (f[l][r][i][j]) 表示 (l) ~ (r) 区间 (l) 位置颜色为 (i) , (r) 位置颜色为 (j) 的方案数;
考虑三种情况 :
1,(r=l+1), 也就是只有一对括号,那么:
(f[l][r][0][1]=f[l][r][0][2]=f[l][r][1][0]=f[l][r][2][0]=1)
2, (p[l]==r) 表示 (l) 与 (r) 匹配,那么:
if(j!=1) f[l][r][0][1]=(1LL*f[l][r][0][1]+f[l+1][r-1][i][j]%mod)%mod;
if(i!=1) f[l][r][1][0]=(1LL*f[l][r][1][0]+f[l+1][r-1][i][j]%mod)%mod;
if(j!=2) f[l][r][0][2]=(1LL*f[l][r][0][2]+f[l+1][r-1][i][j]%mod)%mod;
if(i!=2) f[l][r][2][0]=(1LL*f[l][r][2][0]+f[l+1][r-1][i][j]%mod)%mod;
3, (p[l] != r) 那么:
for(int i=0;i<=2;i++){
for(int j=0;j<=2;j++){
for(int x=0;x<=2;x++){
for(int y=0;y<=2;y++){
if((x==1&&j==1)||(x==2&&j==2)) continue;
f[l][r][i][y]=(1LL*f[l][r][i][y]+1LL*f[l][p[l]][i][j]*f[p[l]+1][r][x][y]%mod)%mod;
}
}
}
}