1. 程式人生 > >552. 學生出勤記錄 II

552. 學生出勤記錄 II

給定一個正整數 n,返回長度為 n 的所有可被視為可獎勵的出勤記錄的數量。 答案可能非常大,你只需返回結果mod 109 + 7的值。

學生出勤記錄是隻包含以下三個字元的字串:

  1. 'A' : Absent,缺勤
  2. 'L' : Late,遲到
  3. 'P' : Present,到場

如果記錄不包含多於一個'A'(缺勤)超過兩個連續的'L'(遲到),則該記錄被視為可獎勵的。

示例 1:

輸入: n = 2
輸出: 8 
解釋:
有8個長度為2的記錄將被視為可獎勵:
"PP" , "AP", "PA", "LP", "PL", "AL", "LA", "LL"
只有"AA"不會被視為可獎勵,因為缺勤次數超過一次。

注意:n 的值不會超過100000。

class Solution {
public:
    int checkRecord(int n) {
        int M = 1000000007;
        vector<int> P(n), L(n), A(n);
        P[0] = 1; L[0] = 1; L[1] = 3;
        A[0] = 1; A[1] = 2; A[2] = 4;
        for (int i = 1; i < n; ++i) {
            P[i] = ((P[i - 1] + L[i - 1]) % M + A[i - 1]) % M;
            if (i > 1) L[i] = ((A[i - 1] + P[i - 1]) % M + (A[i - 2] + P[i - 2]) % M) % M;
            if (i > 2) A[i] = ((A[i - 1] + A[i - 2]) % M + A[i - 3]) % M;
        }
        return ((A[n - 1] + P[n - 1]) % M + L[n - 1]) % M;
    }
};