552. Student Attendance Record II


这是一道典型的动态规划的题目,解题关键在于将原题目分解成适当的子题目。

我们将所有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。

代码如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值