这是一道典型的动态规划的题目,解题关键在于将原题目分解成适当的子题目。
我们将所有rewardable的考勤记录分成以P,A,L结尾的三种,分别用数组P[ ], L[ ], A[ ]三个数组来表示,P[n]指长度为n,以P结尾的rewardable的考勤记录,以此类推。
则所有长度为n的rewardable的考勤记录个数S = P[n] + L[n] + A[n]。
任何rewardable的考勤记录在结尾加上P以后仍然是rewardable的考勤记录,所以P[n] = A[n - 1] + P[n - 1] + L[n - 1]。
以P,A结尾的rewardable的考勤记录的结尾加上L以后仍然是rewardable的考勤记录,而以L结尾的rewardable的考勤记录只有倒数第二个考勤情况不是L时加上L以后才会是rewardable的考勤记录,所以L[n] = A[n - 1] + P[n - 1] + A[n - 2] + P[n - 2]。
A[n]的情况要复杂得多,很明显,A[n] = P[n - 1](不含A)+ L[n - 1](不含A)。而P[n] (不含A)= P[n - 1](不含A) + L[n - 1](不含A),L[n](不含A) = P[n - 1](不含A) + P[n - 2](不含A),化简可得A[n] = A[n - 1] + A[n - 2] + A[n - 3]。
值得注意的是最后的返回的应该是((A[n - 1] + P[n - 1]) % a + L[n - 1]) % a而不是(A[n - 1] + P[n - 1] + L[n - 1]) % a。
代码如下: