学生出勤记录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;

 class Solution {
public:
int checkRecord(int n) {
if (n == 1) return 3;
int mod = 1000000007;
int* A = new int[n + 1];
int* L = new int[n + 1];
int* P = new int[n + 1];
int* noAL = new int[n + 1];
int* noAP = new int[n + 1];
//int A[10], L[10], P[10], noAL[10], noAP[10];
A[1] = L[1] = P[1] = 1;
L[2] = 3;
noAL[1] = noAP[1] = 1;
noAL[2] = noAP[2] = 2;
for (int i = 2; i <= n; i++) {
P[i] = ((P[i - 1] + A[i - 1])%mod + L[i - 1])%mod;
A[i] = (noAP[i - 1] + noAL[i - 1]) % mod;
noAP[i] = (noAP[i - 1] + noAL[i - 1]) % mod;
if (i >= 3) {
L[i] = ((P[i - 1] + A[i - 1]) % mod + (A[i - 2] + P[i - 2]) % mod) % mod;
noAL[i] = (noAP[i - 1] + noAP[i - 2]) % mod;
}
}
return ((A[n] + P[n]) % mod + L[n]) % mod;
}
};

Leetcode 552.学生出勤记录II的更多相关文章

  1. Java实现 LeetCode 552 学生出勤记录 II(数学转换?还是动态规划?)

    552. 学生出勤记录 II 给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量. 答案可能非常大,你只需返回结果mod 109 + 7的值. 学生出勤记录是只包含以下三个字符的 ...

  2. 552 Student Attendance Record II 学生出勤记录 II

    给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量. 答案可能非常大,你只需返回结果mod 109 + 7的值.学生出勤记录是只包含以下三个字符的字符串:    1.'A' : ...

  3. [Swift]LeetCode552. 学生出勤记录 II | Student Attendance Record II

    Given a positive integer n, return the number of all possible attendance records with length n, whic ...

  4. Java实现 LeetCode 551 学生出勤记录 I(暴力大法好)

    551. 学生出勤记录 I 给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : Present,到场 如果一个 ...

  5. 力扣(LeetCode)学生出勤记录I 个人题解

    给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : Present,到场 如果一个学生的出勤记录中不超过一个' ...

  6. 551.学生出勤记录I

    /* * @lc app=leetcode.cn id=551 lang=java * * [551] 学生出勤记录 I * * https://leetcode-cn.com/problems/st ...

  7. hiho1482出勤记录II(string类字符串中查找字符串,库函数的应用)

    string类中有很多好用的函数,这里介绍在string类字符串中查找字符串的函数. string类字符串中查找字符串一般可以用: 1.s.find(s1)函数,从前往后查找与目标字符串匹配的第一个位 ...

  8. [LeetCode] 552. Student Attendance Record II 学生出勤记录之二

    Given a positive integer n, return the number of all possible attendance records with length n, whic ...

  9. [LeetCode] Student Attendance Record II 学生出勤记录之二

    Given a positive integer n, return the number of all possible attendance records with length n, whic ...

随机推荐

  1. pta 编程题7 List Leaves

    其它pta数据结构编程题请参见:pta 这次的编程作业要求从上到下,从左到右输出一棵树的叶子节点,即树的层序遍历,用队列的方式来实现. 注意enqueue和dequeue函数参数为Queue & ...

  2. [转]Cannot deserialize the current JSON array (e.g. [1,2,3]) into type

    string content =[{"id": 3636, "is_default": true, "name": "Unit&q ...

  3. python剑指offer 顺时针打印指针

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  4. GB MB KB B 关系

    1KB=1024Bytes=2的10次方Bytes 1MB=1024KB=2的20次方Bytes 1GB=1024MB=2的30次方Bytes 1TB=1024GB=2的40次方Bytes

  5. cuda科普像素坐标和线性偏移

    cuda科普像素坐标和线性偏移

  6. java内存模型原理阅读总结

    Java内存模型可以理解为在特定操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象.不同架构的物理计算机可以有不一样的内存模型,java虚拟机也有自己的内存模型,java虚拟机规范中试图定义一种 ...

  7. Symmetric Difference-freecodecamp算法题目

    Symmetric Difference 1.要求 创建一个函数,接受两个或多个数组,返回所给数组的对等差分(symmetric difference) 例子:给出两个集合 (如集合 A = {1, ...

  8. 2D和3D效果

    <style type="text/css"> #div1{ width: 200px; height: 200px; background-color:#aaa; c ...

  9. flock文件锁

    linux中的定时任务crontab会定时执行一些脚本,但是脚本的时间往往无法控制,当脚本的执行时间过长,可能会导致上一次任务的脚本还没执行完,下一次任务的脚本又开始执行的问题.这种情况下会出现一些并 ...

  10. PHP去掉字符串中的数字

    这个比较简单,但是也有些需要注意的地方,先贴代码 $class=preg_replace("\\d+",'', $res); 需要使用preg_replace函数,但是只是这么写的 ...