DP
class Solution {private:static constexpr int CEIL = 1000000007;public:int checkRecord(int n) {vector<vector<long long> > dp(n, vector<long long>(6, 0));// dp[i][0~2]表示在第i天,总A数为0,连续L数为0/1/2时的总组合数,// dp[i][3~5]表示在第i天,总A数为1,连续L数为0/1/2时的总组合数dp[0][0] = 1; // 第一天为Pdp[0][1] = 1; // 第一天为Ldp[0][3] = 1; // 第一天为Afor (int i = 1; i < n; ++i) {// 第i天为Pfor (int j = 0; j < 3; ++j) {dp[i][0] = (dp[i][0] + dp[i - 1][j]) % CEIL;}for (int j = 3; j < 6; ++j) {dp[i][3] = (dp[i][3] + dp[i - 1][j]) % CEIL;}// 第i天为Afor (int j = 0; j < 3; ++j) {dp[i][3] = (dp[i][3] + dp[i - 1][j]) % CEIL;}// 第i天为Ldp[i][1] = (dp[i][1] + dp[i - 1][0]) % CEIL;dp[i][2] = (dp[i][2] + dp[i - 1][1]) % CEIL;dp[i][4] = (dp[i][4] + dp[i - 1][3]) % CEIL;dp[i][5] = (dp[i][5] + dp[i - 1][4]) % CEIL;}long long count = 0;for (int i = 0; i < 6; ++i) {count = (count + dp[n - 1][i]) % CEIL;}return count;}};
优化空间复杂度
class Solution {private:static constexpr int CEIL = 1000000007;public:int checkRecord(int n) {vector<long long> dp1(6, 0), dp2(6, 0);dp1[0] = 1; // 第一天为Pdp1[1] = 1; // 第一天为Ldp1[3] = 1; // 第一天为Afor (int i = 1; i < n; ++i) {// 第i天为Pfor (int j = 0; j < 3; ++j) {dp2[0] = (dp2[0] + dp1[j]) % CEIL;}for (int j = 3; j < 6; ++j) {dp2[3] = (dp2[3] + dp1[j]) % CEIL;}// 第i天为Afor (int j = 0; j < 3; ++j) {dp2[3] = (dp2[3] + dp1[j]) % CEIL;}// 第i天为Ldp2[1] = (dp2[1] + dp1[0]) % CEIL;dp2[2] = (dp2[2] + dp1[1]) % CEIL;dp2[4] = (dp2[4] + dp1[3]) % CEIL;dp2[5] = (dp2[5] + dp1[4]) % CEIL;dp1.swap(dp2);fill(dp2.begin(), dp2.end(), 0);}long long count = 0;for (int i = 0; i < 6; ++i) {count = (count + dp1[i]) % CEIL;}return count;}};
优化后时间复杂度为
空间复杂度为
