552. Student Attendance Record II
Problem refer: https://leetcode.com/problems/student-attendance-record-ii/description
// My solution: // A good mathmatical derivation problem. // But it makes me confused with the word: "more than two continuous 'L' (late)". // And finally find it actually represents "LLL". // The last solution refers to the discuss: // https://discuss.leetcode.com/topic/86696/share-my-o-n-c-dp-solution-with-thinking-process-and-explanation class Solution { public: static const int N = 100000 + 1; static const int MOD = 1000000000 + 7; int P[N],L[N],A[N]; int ans[N]; int calc(int n) { if (ans[n]) return ans[n]; calc(n-1); P[n] = (P[n-1] + A[n-1])%MOD + L[n-1]; P[n] %= MOD; L[n] = ((P[n-1] + A[n-1])%MOD + A[n-2])%MOD + P[n-2]; L[n] %= MOD; A[n] = (A[n-1] + A[n-2])%MOD + A[n-3]; A[n] %= MOD; ans[n] = (P[n] + L[n])%MOD + A[n]; ans[n]%=MOD; return ans[n]; } int checkRecord(int n) { memset(ans, 0, sizeof ans); P[1]=L[1]=A[1]=1; ans[1] = 3; P[2] = L[2] = 3; A[2] = 2; ans[2] = 8; P[3] = 8; L[3] = 7; A[3] = 4; ans[3] = 19; return calc(n); } };