学生出勤记录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. Openfire+spark在linux上搭建内部聊天系统

    一.    实验环境 Ubuntu server14.04 openfire:http://www.igniterealtime.org/downloads/index.jsp spark:http: ...

  2. WIN10+Ubuntu14.04 双系统 ubuntu无法有线上网的问题

    注:在WIN10 的引导下安装了双系统,ubuntu有线无法上网,无线却可以. 上网一查,发现之前许多安装双系统的人都存在以上的问题. 常见的解决方法是: 在WINDOWS下关闭网络唤醒,还有一些检查 ...

  3. bzoj1189 [HNOI2007]紧急疏散

    Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一 ...

  4. 如何让图片相对于上层DIV始终保持水平、垂直都居中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 关于请求时状态为cancel

    项目中发现有一个问题,在我发送某些请求的时候请求一会状态就变为cancel了,我滴个乖乖,这是咋回事,被取消了,后来经过仔细排查后发现了以下两个问题 1.AJAX和form表单同时使用,(form提交 ...

  6. Node第二天

    一.http模块: 步骤一:创建http服务器 const https = require('https'); 步骤二:const fs = require('fs'); 步骤三:创建请求=> ...

  7. mysql--连接查询(内外连接)

    连接查询又称多表查询,查询到的字段来自于多个表中的数据. 一. 连接查询的分类和语法 1.分类 按标准分: 92标准:只支持内连接 99标准:支持内连接和.外连接和全外连接 功能进行分类: 内连接:i ...

  8. python 实现剪刀石头布(三局两胜)

    # -*- coding:utf-8 -*- import random # best of three def finger_guess(): rule = {1:'rock', 2:'paper' ...

  9. win7旗舰版64位java的jdk环境变量的配置(2012-12-26-bd 写的日志迁移

    首先到oracle的官方网站http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html下个JDK比如下图: 必须是win ...

  10. 使用virtualbox安装的Ubuntu,窗口分辨率过小,使用增强工具完成和vmtools一样的功能。

    今天用VirtualBox成功装上Ubuntu10.04之后发现了一个问题:默认情况下 ubuntu 的分辨率最高只能设到800*600.但是对于自己的大显示器,在分辨率800*600的ubuntu窗 ...