leetcode552. 学生出勤记录 II(典型的最优规划)

96 篇文章 1 订阅
81 篇文章 1 订阅

https://leetcode-cn.com/problems/student-attendance-record-ii/
给定一个正整数 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。

解答:
这道题一看就知道是最优规划,通过第k位推导第k+1位。
先说一下最优规划的思想,就是第n位的答案完全是基于前n-1位的答案的,这个就可以理解成最优规划的思想。
那自然,最优规划的解题方式就是从前往后,依次推导,直至找到最后的答案

可以奖励的记录有那么几种情况
最后一位是P,且一直没有A
最后一位是P,且有A
最后是L,倒数第二位不是L,无A
最后是L,倒数第二位不是L,有A
最后是LL,无A
最后是LL,有A
最后一位是A

我们依次从第k位推导至第k+1位的公式情况有
P1 = P + L + LL;
PA1 = PA + LA + LLA + A;
L1 = P;
LA1 = PA + A;
LL1 = L;
LLA1 = LA;
A1 = P + L + LL;

最后的代码

public int checkRecord(int n) {
    long P = 1;//最后一位是P,且一直没有A
    long PA = 0;//最后一位是P,且有A
    long L = 1;//最后是L,无A
    long LA = 0;//最后是L有A
    long LL = 0;//最后是LL,无A
    long LLA = 0;//最后是LL,有A
    long A = 1;//最后一位是A
    long P1 = 0;
    long L1 = 0;
    long LL1 = 0;
    long PA1 = 0;
    long LA1 = 0;
    long LLA1 = 0;
    long A1 = 0;
    for (int i = 1; i < n; i++) {
        P1 = (P + L + LL) % 1000000007;
        PA1 = (PA + LA + LLA + A) % 1000000007;
        L1 = P;
        LA1 = (PA + A) % 1000000007;
        LL1 = L;
        LLA1 = LA;
        A1 = (P + L + LL) % 1000000007;
        P = P1;
        PA = PA1;
        L = L1;
        LA = LA1;
        LL = LL1;
        LLA = LLA1;
        A = A1;
    }
    return (int) ((P + L + LL + A + PA + LA + LLA) % 1000000007);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值