1. 程式人生 > >CodeForces149D Coloring Brackets

CodeForces149D Coloring Brackets

main clu 序列 lse str def codeforce %d ack

題目鏈接

給出一個合法的括號序列,你可以將每個括號染上紅色或藍色,一對括號中有且只有一個被染色,相鄰括號不能染上同一顏色,問合法染色方案個數

狀態需要保存當前區間左右括號顏色,分左右邊界是否為同一對括號來更新

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int mod = 1000000007;
char s[705];
int n;
int top, sta[705], match[705];
long long f[705][705][9];
void ModAdd(long
long & x, long long y) { x += y; if(x >= mod) x-= mod; } long long DP(int l, int r, int k) { int lcol = k / 3, rcol = k % 3; if(r - l == 1) { // printf("%d %d %d\n", k, lcol, rcol); if((lcol == 0) == (rcol == 0)) return 0; return 1; } long long & res = f[l][r][k]; if
(res != -1) return res; res = 0; if(match[l] == r) { if((lcol == 0) == (rcol == 0)) return res; for(int i = 0; i < 3; i++) { if(i != 0 && lcol != 0 && i == lcol) continue; for(int j = 0; j < 3; j++) { if(j != 0 && rcol != 0
&& j == rcol) continue; ModAdd(res, DP(l + 1, r - 1, i * 3 + j)); } } } else { for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { if(i != 0 && j != 0 && i == j) continue; ModAdd(res, DP(l, match[l], lcol * 3 + i) * DP(match[l] + 1, r, j * 3 + rcol) % mod); } } } // printf("%d %d %d %d %lld\n", l, r, lcol, rcol, res); return res; } int main() { scanf("%s", s); n = strlen(s); for(int i = 0; i < n; i++) { if(s[i] == ‘(‘) sta[top++] = i; else match[sta[--top]] = i; } long long ans = 0; memset(f, -1, sizeof(f)); for(int i = 0; i < 9; i++) ModAdd(ans, DP(0, n - 1, i)); cout << ans << endl; return 0; }

CodeForces149D Coloring Brackets