首页 > 其他分享 >lc552 学生出勤记录2

lc552 学生出勤记录2

时间:2024-03-20 21:15:24浏览次数:16  
标签:缺勤 记录 lc552 迟到 出勤 int MInt dp

有n天,每天出勤可以是缺勤,迟到或正常,要求总缺勤天数少于两天,且不存在连续3天及以上的迟到,问有多少种可行的情况?结果对1e9+7取模。
1<=n<=1e5

记数类dp问题,用刷表法好写点,即假设当前为第i天,已缺勤j天,已连续迟到k天,方案数为dp[i][j][k],再分别枚举接下的一天选择什么,来更新第i+1天的结果。当然也可以用记忆化dfs来写,另外还可以用矩阵快速幂加速到O(logn)。

template<int MOD>
struct MInt {
    int x;
    int norm(int u) const {u%=MOD; if(u<0) u+=MOD; return u;}
    MInt(int v=0):x(norm(v)) {}
    int val() const {return x;}
    MInt operator-() const {return MInt(norm(MOD-x));}
    MInt inv() const {assert(x!=0); return power(MOD-2);}
    MInt &operator*=(const MInt &o) {x=norm(x*o.x); return *this;}
    MInt &operator+=(const MInt &o) {x=norm(x+o.x); return *this;}
    MInt &operator-=(const MInt &o) {x=norm(x-o.x); return *this;}
    MInt &operator/=(const MInt &o) {*this *= o.inv(); return *this;}
    friend MInt operator*(const MInt &a, const MInt &b) {MInt ans=a; ans*=b; return ans;}
    friend MInt operator+(const MInt &a, const MInt &b) {MInt ans=a; ans+=b; return ans;}
    friend MInt operator-(const MInt &a, const MInt &b) {MInt ans=a; ans-=b; return ans;}
    friend MInt operator/(const MInt &a, const MInt &b) {MInt ans=a; ans/=b; return ans;}
    friend std::istream &operator>>(std::istream &is, MInt &a) {int u; is>>u; a=MInt(u); return is;}
    friend std::ostream &operator<<(std::ostream &os, const MInt &a) {os<<a.val(); return os;}
    MInt power(int b) const {int r=1, t=x; while(b){if(b&1) r=r*t%MOD; t=t*t%MOD; b/=2;} return MInt(r);}
};
using mint = MInt<1000000007>;

const int N = 100005;
mint dp[N][2][3];
class Solution {
public:
    int checkRecord(int n) {
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j < 2; j++) {
                for (int k = 0; k < 3; k++) {
                    dp[i][j][k] = 0;
                }
            }
        }
        dp[0][0][0] = 1;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 2; j++) {
                for (int k = 0; k < 3; k++) {
                    dp[i+1][j][0] += dp[i][j][k];
                    if (k < 2) dp[i+1][j][k+1] += dp[i][j][k];
                    if (j < 1) dp[i+1][j+1][0] += dp[i][j][k];
                }
            }
        }
        mint ans = 0;
        for (int j = 0; j < 2; j++) {
            for (int k = 0; k < 3; k++) {
                ans += dp[n][j][k];
            }
        }
        return ans.val();
    }
};

标签:缺勤,记录,lc552,迟到,出勤,int,MInt,dp
From: https://www.cnblogs.com/chenfy27/p/18086074

相关文章

  • 操作系统综合题之“用记录型信号量机制的wait和signal操作来解决了由北向南和由南向北
    1.问题:一条哦东西走向河流上,有一根南北走向的独木桥,要想过河只能通过这根独木桥。只要人们朝着相同的方向过独木桥,同一时刻允许有多个人可以通过。如果在相反的方向上同时有两个人过独木桥则会发生死锁。如果一个人想过河,他必须看当前独木桥的通信情况,若当前的通行方向与他的过河......
  • 2024年中国传媒大学程序设计大赛(同步赛)赛题记录
    比赛地址:https://ac.nowcoder.com/acm/contest/77526开错题了,赛时就出了5题;补题顺带写一下记录A:小苯的区间和疑惑链接:https://ac.nowcoder.com/acm/contest/77526/A大意:给一个数组\(a\),让你对数组中每一个数\(a_i\),求包含这个数的一个区间,要求这个区间的值的和最大;......
  • 模拟赛记录2024.03
    2024.03模拟赛记录2024.03.20TheBrickTowerMediumDivOne不考虑相同元素顺序,最优解的形式为,将原序列从小到大排序,从前往后依次放在当前答案的开头或者结尾考虑相同元素的影响,发现在贪心的同时记录当前放在首尾的同样元素的编号然后贪心的把小的编号靠前即可code//Autho......
  • LeetCode刷题记录——day2
    https://leetcode.cn/problems/product-of-array-except-self/description/?envType=study-plan-v2&envId=top-interview-150问题在于不使用除法并且空间复杂度为O(1),当第一次从头开始遍历时由于不知道后续数组元素是什么,所以无法得到答案,而如果当知道一个后续数组元素后,又回去更......
  • leetcode代码记录(长度最小的子数组
    目录1.题目:2.我的代码:小结:1.题目:给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的连续子数组[numsl,numsl+1,…,numsr-1,numsr],并返回其长度。如果不存在符合条件的子数组,返回0。示例1:输......
  • 操作系统综合题之“用记录型信号量机制的wait和signal操作来保证文件的正确打印,并写出
    1.问题:有两个进程pA和pB合作解决文件打印的问题:pA将文件记录从磁盘读入住库存的缓冲区,每次执行一次读一个记录;pB将缓冲区的内容打印出来,每次执行一次打印一个记录。缓冲区的大小等于一个记录大小请用记录型信号量机制的wait(S)和signal(S)操作来保证文件的正确打印,并写出同步代码2.......
  • Blazor学习记录三
    11.自定义组件与消费端变量之间实现双向绑定这也实现了从子组件到父组件的状态传递。1.定义一个数据类型为T的参数。2.再定义一个参数名+[Changed]为名称,EventCallback结构类型的参数。注意T类型要和第一步中的参数数据类型T相同。3.定义一个被用于元素中的C#事件触发的事件......
  • 操作系统综合题之“采用记录型信号量机制实现进程INPUT、PROCESS和OUTPUT的同步算法(
    1.问题:系统中有有三个进程INPUT、PROCESS和OUTPUT,共用两个缓冲区BUF1和BUF2。假期设BUF1中最多可放10个数据,现已放入了2个数据;BUF2最多可放5个数据。INPUT进程负责不断将输入的原始数据推送入BUF1,PROCESS进程负责从BUF1中取出原始数据进行处理,并将处理后的结果数据送入到BUF2中,OUT......
  • w10下安装mysql8.0及dbeaver24记录
    1、首先到官网或者下载网站,下载mysql8.0的安装包,本次是从第三方下载网站下载的msi安装包,直接点开安装就行2、安装完后,参考https://blog.csdn.net/Javachichi/article/details/1327585513、然后下载安装dbeaver,安装好后配置连接mysql,其中自动下载mysql驱动时可能会报错,提示maven......
  • 使用AOP记录feign调用日志
    文章目录业务场景使用DemoClientFeignDemlFeignFallBack主要代码DockLogAspectDockLogDockLogServiceDockLogAddDTOJacksonUtils业务场景记录请求第三方接口的情况。@DockLog可以用在类上也可以用在方法上使用DemoClientFeignimportorg.springframework.cloud......