DP

  1. class Solution {
  2. private:
  3. static constexpr int CEIL = 1000000007;
  4. public:
  5. int checkRecord(int n) {
  6. vector<vector<long long> > dp(n, vector<long long>(6, 0));
  7. // dp[i][0~2]表示在第i天,总A数为0,连续L数为0/1/2时的总组合数,
  8. // dp[i][3~5]表示在第i天,总A数为1,连续L数为0/1/2时的总组合数
  9. dp[0][0] = 1; // 第一天为P
  10. dp[0][1] = 1; // 第一天为L
  11. dp[0][3] = 1; // 第一天为A
  12. for (int i = 1; i < n; ++i) {
  13. // 第i天为P
  14. for (int j = 0; j < 3; ++j) {
  15. dp[i][0] = (dp[i][0] + dp[i - 1][j]) % CEIL;
  16. }
  17. for (int j = 3; j < 6; ++j) {
  18. dp[i][3] = (dp[i][3] + dp[i - 1][j]) % CEIL;
  19. }
  20. // 第i天为A
  21. for (int j = 0; j < 3; ++j) {
  22. dp[i][3] = (dp[i][3] + dp[i - 1][j]) % CEIL;
  23. }
  24. // 第i天为L
  25. dp[i][1] = (dp[i][1] + dp[i - 1][0]) % CEIL;
  26. dp[i][2] = (dp[i][2] + dp[i - 1][1]) % CEIL;
  27. dp[i][4] = (dp[i][4] + dp[i - 1][3]) % CEIL;
  28. dp[i][5] = (dp[i][5] + dp[i - 1][4]) % CEIL;
  29. }
  30. long long count = 0;
  31. for (int i = 0; i < 6; ++i) {
  32. count = (count + dp[n - 1][i]) % CEIL;
  33. }
  34. return count;
  35. }
  36. };

优化空间复杂度

  1. class Solution {
  2. private:
  3. static constexpr int CEIL = 1000000007;
  4. public:
  5. int checkRecord(int n) {
  6. vector<long long> dp1(6, 0), dp2(6, 0);
  7. dp1[0] = 1; // 第一天为P
  8. dp1[1] = 1; // 第一天为L
  9. dp1[3] = 1; // 第一天为A
  10. for (int i = 1; i < n; ++i) {
  11. // 第i天为P
  12. for (int j = 0; j < 3; ++j) {
  13. dp2[0] = (dp2[0] + dp1[j]) % CEIL;
  14. }
  15. for (int j = 3; j < 6; ++j) {
  16. dp2[3] = (dp2[3] + dp1[j]) % CEIL;
  17. }
  18. // 第i天为A
  19. for (int j = 0; j < 3; ++j) {
  20. dp2[3] = (dp2[3] + dp1[j]) % CEIL;
  21. }
  22. // 第i天为L
  23. dp2[1] = (dp2[1] + dp1[0]) % CEIL;
  24. dp2[2] = (dp2[2] + dp1[1]) % CEIL;
  25. dp2[4] = (dp2[4] + dp1[3]) % CEIL;
  26. dp2[5] = (dp2[5] + dp1[4]) % CEIL;
  27. dp1.swap(dp2);
  28. fill(dp2.begin(), dp2.end(), 0);
  29. }
  30. long long count = 0;
  31. for (int i = 0; i < 6; ++i) {
  32. count = (count + dp1[i]) % CEIL;
  33. }
  34. return count;
  35. }
  36. };

优化后时间复杂度为
552. 学生出勤记录 II 2021-08-18 - 图1
空间复杂度为
552. 学生出勤记录 II 2021-08-18 - 图2