Leetcode 552.学生出勤记录II
学生出勤记录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。
思路
首先,定义几个函数
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的更多相关文章
- Java实现 LeetCode 552 学生出勤记录 II(数学转换?还是动态规划?)
552. 学生出勤记录 II 给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量. 答案可能非常大,你只需返回结果mod 109 + 7的值. 学生出勤记录是只包含以下三个字符的 ...
- 552 Student Attendance Record II 学生出勤记录 II
给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量. 答案可能非常大,你只需返回结果mod 109 + 7的值.学生出勤记录是只包含以下三个字符的字符串: 1.'A' : ...
- [Swift]LeetCode552. 学生出勤记录 II | Student Attendance Record II
Given a positive integer n, return the number of all possible attendance records with length n, whic ...
- Java实现 LeetCode 551 学生出勤记录 I(暴力大法好)
551. 学生出勤记录 I 给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : Present,到场 如果一个 ...
- 力扣(LeetCode)学生出勤记录I 个人题解
给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : Present,到场 如果一个学生的出勤记录中不超过一个' ...
- 551.学生出勤记录I
/* * @lc app=leetcode.cn id=551 lang=java * * [551] 学生出勤记录 I * * https://leetcode-cn.com/problems/st ...
- hiho1482出勤记录II(string类字符串中查找字符串,库函数的应用)
string类中有很多好用的函数,这里介绍在string类字符串中查找字符串的函数. string类字符串中查找字符串一般可以用: 1.s.find(s1)函数,从前往后查找与目标字符串匹配的第一个位 ...
- [LeetCode] 552. Student Attendance Record II 学生出勤记录之二
Given a positive integer n, return the number of all possible attendance records with length n, whic ...
- [LeetCode] Student Attendance Record II 学生出勤记录之二
Given a positive integer n, return the number of all possible attendance records with length n, whic ...
随机推荐
- SQL Server 08版与14版处理重复行的方式
在项目中,利用循环拼接成了插入多行数据的SQL语句: Insert into table(col1,col2)vaules(value11,value21); Insert into table(co ...
- 如何使用cPanel管理域名和数据库
cPanel是一个基于web的基于web的控制面板,它简化了许多常见的系统管理任务,如网站创建.数据库部署和管理等.本指南向您展示了如何使用cPanel用户帐户管理域和数据库.所有这些指令都与位于端口 ...
- Api容器在应用架构演化中的用途
单层架构 在最开始编程的时候相信大家都写过下面这种架构,界面代码,业务代码,数据库连接全部在工程面完成.当然这种架构在处理很小的程序的时候依然有生命力 两层架构 后来我们发现数据访问的代码大量重复,应 ...
- 工作流性能优化(敢问activiti有扩展性?)(1)
工作流待办(首页待办列表),加载缓慢,activiti本机,看了代码又是全部数据加载到内存,然后代码过滤,我为什么又说又呢? 用VisualVM做性能测试: 之前同事给的解决方案: 1.把&quo ...
- UVA 12166 Equilibrium Mobile(贪心,反演)
直接贪心.先想想最后平衡的时候,如果知道了总重量,那么每一个结点的重量其实也就确定了. 每个结点在左在右其实都不影响,只和层数有关.现在反过来,如果不修改某个结点,那么就可以计算出总质量,取总质量出现 ...
- gearmand 编译 could not find gperf
安装步骤: #wget https://launchpad.net/gearmand/1.2/1.1.8/+download/gearmand-1.1.8.tar.gz #tar zxvf gearm ...
- 2017.12.23 第二章 统一建模语言UML概述
第二章 统一建模语言UML概述 (1)为什么要建模 模型是某个事物的抽象,其目的是在构建这个事物之前先来理解它,因为模型忽略了那些非本质的细节,这样有利于更好的理解和表示事物: 在软件系统开发之前首先 ...
- samba性能调优,调优后,性能增加30%
global中增加下面内容. [global] use sendfile = yes write raw = yes read raw = yes max xmit = 655 ...
- 小弟在研究CUDA时出现一个问题,求解
这是<GPU高性能编程CUDA中文实战>中的例子,第七章,热传导模拟,但是出现下面的问题,求牛人解读.小弟跪谢... 主要问题就是关键字变白. 但是添加需要的头文件后一些系统自带的关键字也 ...
- MyElipes遇到 source not found解决方案
在用Myeclipse 或者是eclipse进行开发时候经常遇到这个问题. File class editor source not found问题.原因很简单,就是因为这是一个源码包,相应的没有编 ...