* A L P * AL AP LL LA LP PL PP PA * ALL ALP APL APP LLA LLP LAL LAP LPA LPL LPP PLA PLL PLP PPA PPL PPP PAL PAP * * ch = 'L' && 'L' < 3 * i < n > 0, j < f(i - 1).size() * * if ch == '1*L' LL LP * else if ch == '2*L' LP * else if ch == '0*L' PP PL * if ch == '0*A' PA LA * */
// @lc code=start class Solution { public: int checkRecord(int n) { vector<vector<vector<int>>> f(0, vector<vector<int>>(0, vector<int>(2, 0))); f.push_back({{{1}, {0}}, {{0}, {1}}, {{0}, {0}}}); for (int i = 1; i < n; ++i) { vector<vector<int>> tmp; for (int j = 0; j < f[i - 1].size(); ++j) { int l = f[i - 1][j][1], a = f[i - 1][j][0]; if (l == 1) { tmp.push_back({{a}, {2}}); tmp.push_back({{a}, {0}}); } else if (l == 2) { tmp.push_back({{a}, {0}}); } else if (l == 0) { tmp.push_back({{a}, {0}}); tmp.push_back({{a}, {1}}); } if (a == 0) { tmp.push_back({{1}, {0}}); } } f.push_back(tmp); } return f[f.size()-1].size(); } }; // @lc code=end
/** * A L P * AL AP LL LA LP PL PP PA * ALL ALP APL APP LLA LLP LAL LAP LPA LPL LPP PLA PLL PLP PPA PPL PPP PAL PAP * * f[i][j][0] * * ch = 'L' && 'L' < 3 * i < n > 0, j < f(i - 1).size() * * if ch == '1*L' LL LP * else if ch == '2*L' LP * else if ch == '0*L' PP PL * if ch == '0*A' PA LA * */
// @lc code=start class Solution { public: static constexpr int MOD = 1'000'000'007; int checkRecord(int n) { /** * 超时 */ // vector<vector<vector<int>>> f(0, vector<vector<int>>(0, vector<int>(2, 0))); // f.push_back({{{1}, {0}}, {{0}, {1}}, {{0}, {0}}}); // for (int i = 1; i < n; ++i) { // vector<vector<int>> tmp; // for (int j = 0; j < f[i - 1].size(); ++j) { // int l = f[i - 1][j][1], a = f[i - 1][j][0]; // if (l == 1) { // tmp.push_back({{a}, {2}}); // tmp.push_back({{a}, {0}}); // } else if (l == 2) { // tmp.push_back({{a}, {0}}); // } else if (l == 0) { // tmp.push_back({{a}, {0}}); // tmp.push_back({{a}, {1}}); // } // if (a == 0) { // tmp.push_back({{1}, {0}}); // } // } // f.push_back(tmp); // } // return f[f.size()-1].size(); vector<vector<vector<int>>> f(n + 1, vector<vector<int>>(2, vector<int>(3, 0))); f[0][0][0] = 1; for (int i = 1; i <= n; ++i) { for (int j = 0; j < 2; ++j) { for (int k = 0; k < 3; ++k) { f[i][j][0] = (f[i][j][0] + f[i - 1][j][k]) % MOD; } } for (int k = 0; k < 3; ++k) { f[i][1][0] = (f[i][1][0] + f[i - 1][0][k]) % MOD; } for (int j = 0; j < 2; ++j) { for (int k = 0; k < 2; ++k) { f[i][j][k + 1] = (f[i][j][k + 1] + f[i - 1][j][k]) % MOD; } } } int res = 0; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) { res = (res + f[n][i][j]) % MOD; } } return res; } }; // @lc code=end