DP[何個目][どの色が残っている][次に消すべき色] = パターン数
k が 1-based ということを見落として数時間を浪費して悲しい。
const int N = 100000 + 5; const int BIT = 1 << 3; const int color = 3; static lli dp[N][BIT][color]; class AlternateColors2 { public: long long countWays(int n, int k) { fill(&dp[0][0][0], &dp[N - 1][BIT - 1][color - 1] + 1, 0); const int red = 0; for (int bit = 1; bit < BIT; ++bit) { dp[0][bit][red] = 1; } for (int nth = 0; nth < n; ++nth) { for (int rest = 0; rest < BIT; ++rest) { for (int c = 0; c < color; ++c) { if (nth == k - 1 && c != red) continue; int d = c; for (int i = 0; i < 3; ++i) { d = (d + 1) % color; if (rest & (1 << d)) break; } int curr = dp[nth][rest][c]; if (rest & (1 << c)) { dp[nth + 1][rest][d] += curr; dp[nth + 1][rest ^ (1 << c)][d] += curr; } } } } return dp[n][0][0] + dp[n][0][1] + dp[n][0][2]; } };