552. 學生出勤記錄 II
阿新 • • 發佈:2019-01-06
給定一個正整數 n,返回長度為 n 的所有可被視為可獎勵的出勤記錄的數量。 答案可能非常大,你只需返回結果mod 109 + 7的值。
學生出勤記錄是隻包含以下三個字元的字串:
- 'A' : Absent,缺勤
- 'L' : Late,遲到
- '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;
}
};