552. Student Attendance Record II

本文介绍了一种使用动态规划解决考勤奖励问题的方法。通过将原始问题分解为以P、A、L结尾的子问题,并利用数组P、L、A进行记录。详细解释了每个数组元素之间的递推关系,并给出了最终的计算公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

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

代码如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值