• Leetcode 552.学生出勤记录II


    学生出勤记录II

    给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量。 答案可能非常大,你只需返回结果mod 109 + 7的值。

    学生出勤记录是只包含以下三个字符的字符串:

    1. 'A' : Absent,缺勤
    2. 'L' : Late,迟到
    3. 'P' : Present,到场

    如果记录不包含多于一个'A'(缺勤)超过两个连续的'L'(迟到),则该记录被视为可奖励的。

    示例 1:

    输入: n = 2

    输出: 8

    解释:

    有8个长度为2的记录将被视为可奖励:

    "PP" , "AP", "PA", "LP", "PL", "AL", "LA", "LL"

    只有"AA"不会被视为可奖励,因为缺勤次数超过一次。

    注意:n 的值不会超过100000。

    思路

    首先,定义几个函数

    Total(n): 字符长度为n的符合条件的个数

    P(n): 字符长度为n的并且最后一位为P的符合条件的个数

    L(n): 字符长度为n的并且最后一位为L的符合条件的个数

    A(n):字符长度为n的并且最后一位为A的符合条件的个数

    noAP(n):字符长度为n的并且没有一个A字符而且最后一位为P的符合条件的个数

    noAL(n):字符长度为n的并且没有一个A字符而且最后一位为L的符合条件的个数

    根据定义,可以得到

    Total(n) = P(n) + L(n) + A(n); (n>=1)

    P(n) = P(n-1) + L(n-1) + A(n-1); (n>=2)

    然后由于规则规定不能有三个连续一起L字符,不然判定不符合条件,所以

    L(n) = P(n-1) + A(n-1) + P(n-2) + A(n-2); (n>=3)

    而且最多只能有一个A字符,因此

    A(n) = noAP(n-1) + noAL(n-1); (n>=2)

    同时,

    noAP(n) = noAP(n-1) + noAL(n-1); (n>=2)

    noAL(n) = noAP(n-1) + noAP(n-2); (n>=3)

    由上面的关系式,然后我们再初始化一些条件,

    P(1) = A(1) = L(1) = 1;

    L(2) = 1;

    noAL(1) = noAP(1) = 1;

    noAL(2) = noAP(2) = 2;

     1 class Solution {
     2     public:
     3     int checkRecord(int n) {
     4         if (n == 1) return 3;
     5         int mod = 1000000007;
     6         int* A = new int[n + 1];
     7         int* L = new int[n + 1];
     8         int* P = new int[n + 1];
     9         int* noAL = new int[n + 1];
    10         int* noAP = new int[n + 1];
    11         //int A[10], L[10], P[10], noAL[10], noAP[10]; 
    12         A[1] = L[1] = P[1] = 1;
    13         L[2] = 3;
    14         noAL[1] = noAP[1] = 1;
    15         noAL[2] = noAP[2] = 2;
    16         for (int i = 2; i <= n; i++) {
    17             P[i] = ((P[i - 1] + A[i - 1])%mod + L[i - 1])%mod;
    18             A[i] = (noAP[i - 1] + noAL[i - 1]) % mod;
    19             noAP[i] = (noAP[i - 1] + noAL[i - 1]) % mod;
    20             if (i >= 3) {
    21                 L[i] = ((P[i - 1] + A[i - 1]) % mod + (A[i - 2] + P[i - 2]) % mod) % mod;
    22                 noAL[i] = (noAP[i - 1] + noAP[i - 2]) % mod;
    23             }
    24         }
    25         return ((A[n] + P[n]) % mod + L[n]) % mod;
    26     }
    27 };
  • 相关阅读:
    010:请教STM32用JLINK V8 SWD输出调试信息到ITM Viewer的问题(转)
    014:针对mdk中STM32程序无法使用printf,产生停留BEAB BKPT 0xAB处问题的解决(转)
    011:Nuvoton(新唐) Cortex M0 使用semihost输入输出办法(转)
    015:6步教你在STM32程序中添加 printf函数(转)
    js定时和离开当前页面事件 明天
    linux常用命令 明天
    mongoDB常用命令 明天
    自定义标签的使用 明天
    浏览器事件 明天
    SonarQube简介
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10373971.html
Copyright © 2020-2023  润新知