力扣学生出勤纪录

class Solution {
    
    
public:
    int checkRecord(int n) {
    
    
        const long MOD=1e9+7;
        long f[4][2];
        //缺席,正常,迟一,迟二
        //是否存在缺席
        memset(f,0,sizeof f);
        long fpre[4][2];
        f[0][1]=1;
        f[1][0]=1;
        f[2][0]=1;
        for(int i=2;i<=n;i++){
    
    
            memcpy(fpre,f,sizeof f);
            f[0][1]=(fpre[1][0]+fpre[2][0]+fpre[3][0])%MOD;
            f[1][1]=(fpre[0][1]+fpre[2][1]+fpre[3][1]+fpre[1][1])%MOD;
            f[1][0]=(fpre[2][0]+fpre[3][0]+fpre[1][0])%MOD;
            f[2][1]=(fpre[0][1]+fpre[1][1])%MOD;
            f[2][0]=(fpre[1][0]);
            f[3][1]=(fpre[2][1]);
            f[3][0]=fpre[2][0];
        }
        long ans=0;
        for(int i=0;i<4;i++){
    
    
            for(int j=0; j<2;j++){
    
    
                ans=(ans+f[i][j])%MOD;
            }
        }
        return ans;
    }
};

可以用矩阵优化

猜你喜欢

转载自blog.csdn.net/weixin_39057744/article/details/119777500