JAVA程序设计:学生出勤记录 II(LeetCode:552)

给定一个正整数 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。

思路:明显的动态规划,不过自己写的比较挫,因此,放上自己的版本以及官方的版本(两个都能过)

自己的版本:定义dp[i][j][k][h]:代表遍历到第i位并且以j结尾且上一次是不是迟到以及之前有没有出现缺勤记录。状态转移比较繁琐,希望读者能够自行看懂我的代码~

class Solution {
	
	private int mod=1000000007;
	
    public int checkRecord(int n) {
        
    	int[][][][] dp=new int[n][3][3][2];
    	dp[0][0][0][1]=dp[0][1][1][0]=dp[0][2][0][0]=1;
    	for(int i=1;i<n;i++) {
    		dp[i][0][0][1]+=((dp[i-1][1][1][0]+dp[i-1][2][0][0])%mod+dp[i-1][1][2][0])%mod;
    		dp[i][1][1][0]+=dp[i-1][2][0][0]%mod;
    		dp[i][1][1][1]+=(dp[i-1][0][0][1]+dp[i-1][2][0][1])%mod;
    		dp[i][1][2][0]+=dp[i-1][1][1][0]%mod;
    		dp[i][1][2][1]+=dp[i-1][1][1][1]%mod;
    		dp[i][2][0][0]+=((dp[i-1][1][1][0]+dp[i-1][1][2][0])%mod+dp[i-1][2][0][0])%mod;
    		dp[i][2][0][1]+=(((dp[i-1][1][1][1]+dp[i-1][1][2][1])%mod+dp[i-1][0][0][1])%mod+dp[i-1][2][0][1])%mod;
    	}
    	int ans=0;
    	for(int i=0;i<3;i++)
    		for(int j=0;j<3;j++)
    			for(int k=0;k<2;k++)
    				ans=(ans+dp[n-1][i][j][k])%mod;
    	return ans;
    }
}

官方版本一:

递推公式为:f[i]=2*f[i-1]+f[i-4],说实话我是懵逼的,之后懂了回来补下解释。。。还是我自己的方法比较直观!!!

class Solution {
	
	private int mod=1000000007;
	
    public int checkRecord(int n) {
        
    	long[] f=new long[n<=5?6:n+1];
    	f[0]=1; f[1]=2; f[2]=4; f[3]=7;
    	for(int i=4;i<=n;i++)
    		f[i]=(2*f[i-1]%mod+(mod-f[i-4]))%mod;
    	long ans=f[n];
    	for(int i=1;i<=n;i++)
    		ans+=(f[i-1]*f[n-i])%mod;
    	return (int)(ans%mod);
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值