Student Attendance Record II

Given a positive integer n, return the number of all possible attendance records with length n, which will be regarded as rewardable. The answer may be very large, return it after mod 109 + 7.

A student attendance record is a string that only contains the following three characters:

  1. 'A' : Absent.
  2. 'L' : Late.
  3. 'P' : Present.

A record is regarded as rewardable if it doesn't contain more than one 'A' (absent) or more than two continuous 'L' (late).

Example 1:

Input: n = 2
Output: 8 
Explanation:
There are 8 records with length 2 will be regarded as rewardable:
"PP" , "AP", "PA", "LP", "PL", "AL", "LA", "LL"
Only "AA" won't be regarded as rewardable owing to more than one absent times. 

Note: The value of n won't exceed 100,000.

题目描述:每天有三种出勤情况:A:出席;L:迟到;P:旷课;连续迟到两天以上(不含),或者旷课一次以上(不含)记为无奖励。问连续n天的出勤状况,有多少种有奖励的组合。

结题思路:动态规划,记录连续i天的有奖励组合数目,递推数连续i+1天的有奖励组合数目。根据有奖励的限制,我们应当把连续i天的有奖励组合进行分类,根据第一条限制,连续迟到不能超过两天,我们可以将出勤情况分为3类,因为要求连续迟到,因此我们只关心组合末尾的连续迟到天数,既然有奖励(连续迟到不超过两天),那么连续迟到天数就只能是0,1和2;根据第二条限制,旷课不超过一次,我们可以分为两类,一类是此前没有旷课过,和此前旷课一次;将两种分类综合起来,我们可以吧连续i天的有奖励出勤组合分为6类:

dp[i][0]:此前未旷课,且最后一天未迟到

dp[i][1]:此前未旷课,且最后一天迟到

dp[i][2]:此前未旷课,且最后两天迟到

dp[i][3]:此前旷课一次,且最后一天未迟到

dp[i][4]:此前旷课一次,且最后一天迟到

dp[i][5]:此前旷课一次,且最后两天迟到

接下来我们想一想递推公式,用dp[i][0]A表示前i天未旷课,且第i天没有迟到,且第i+1天出席,类似的,用dp[i][1]L表示前i天没有旷课,且第i天迟到,且第i+1天迟到,我们可以把递推公式总结如下:

dp[i+1][0] = dp[i][0]P + dp[i][1]P + dp[i][2]P + dp[i][3]A + dp[i][4]A + dp[i][5]A

dp[i+1][1] = dp[i][0]L

dp[i+1][2] = dp[i][1]L

dp[i+1][3] = dp[i][3]P + dp[i][4]P + dp[i][5]P

dp[i+1][4] = dp[i][3]L

dp[i+1][5] = dp[i][4]L

然后我们发现,实际上只需要记录两天的出勤数目,即前一天和今天,然后迭代计算,综上,代码如下:

    public int checkRecord(int n) {
        long[] cur = new long[]{1, 0, 0, 1, 1, 0}, next;
        if(n == 0)
        	return 0;
        for(int i = 1; i < n; i++){
        	next = new long[6];
        	next[0] = cur[0] + cur[1] + cur[2] + cur[3] + cur[4] + cur[5];
        	next[1] = cur[0];
        	next[2] = cur[1];
        	next[3] = cur[3] + cur[4] + cur[5];
        	next[4] = cur[3];
        	next[5] = cur[4];
        	for(int j = 0; j < 6; j++)
        		next[j] %= 1000000007;
        	cur = next;
        }
        long res = 0;
        for(long num : cur)
        	res += num;
        res %= 1000000007;
        return (int)res;
    }

阅读更多

Student Record Inquiry System(学生成绩查询系统)开发计划书

12-27

rn这个是一个计划项目,欢迎大家提提建议。rn欢迎大家说说自己心目中的学生成绩查询系统是什么样的?rn:)rnrnrnStudent Record Inquiry System(学生成绩查询系统)开发计划书rnrnrnrnrnrn主要功能:rnrn系统客户端:1.普通注册用户登陆,只能浏览到学校的一些新闻,公告之类的信息。rn2.普通注册用户可以申请进入某人班级,经班级指导员批准,可以查询自己的个科目成绩,学期评语,以及相关的自身个人信息。(如果指导员设置班级的每一个学生都可以浏览其他学生的成绩,那么该学生还可以查看班级的其他学生信息。)rn3.高级用户权限,该类用户的面向对象是学校校长之类的,可以查看系/级/班的所有学生成绩,档案,学期评语等等。rn4.用户查看班级,年级时可以按照学生的学号/各科成绩/总成绩等等进行有条件排序查看。rnrn系统教师端:1.科任教师注册后等待班级指导员开通权限后,科任教师可填加学生该科的成绩。rn2.班级指导员可以填加/修改/删除该班该学期的科目。rn3.班级指导员可以编辑/删除该班各个学生的学期评语和各科成绩。rn4.班级指导员可以查询该班各个学生的成绩和评语。rn5.班级指导员可以锁定学生资料,避免学生编辑个人相关信息。rn6.班级指导员可以对学生进行编辑/删除管理。rn7.级长,继承所有班级指导员地权限,但是其管理范围为该年级以内。rn8.校长/主任,继承全校所有班级指导员的权限。rnrn后台管理 :1.可以对各班级的科目/科任教师进行相关的操作(填加/编辑/删除)。rn2.填加/编辑/删除各班班级/年级,以及委任相关的班级指导员。rn3.设置系统参数。rn4.可以对设置该校的级长/校主任/校长。rn5.对所有数据进行备份和还原。rn6.记录管理员登陆信息。rn7.~~~~~I还没有想好,应该是很全的,只是想不起来。rn

没有更多推荐了,返回首页