这是老师在算法课上布置的一道算法题目,有关动态规划
问题描述:n个问题,要用k个问题组成出卷方式,每道算法题目都有一定的难度等级,假设一次测验中的所有k道题目都有不同的难度等级,那么这次期末测试就是有区分度的,计算可以设计有多少种区分度的期末试卷?
题解
因为题目中不会凑巧都是不同梯度的难题,可能会存在两个或者三个(以上)梯度的题目,考虑如何去解决这个问题?
假想把这组题目分块,将相同梯度的问题划分到一个块中,查询,遇到了相同的梯度难度的问题就+1,如果没查询到就是1(表示这个块中只有这一个梯度难度的问题),最后计算出Cnk。
解决的问题
1:如何统计每个块中的数量?
map映射map<key,value>通过输入key去查询value,将输入的题目作为key,出现的次数作为value,<难度,次数>比如说:在第一次遇到1时就把<1,1>放入map中,第二次遇到1时先查一下是否有这样的映射,如果存在就<1,2>,否则就是<1,1>.以此查询.
2:如何计算Cnk?
定义一个dp二维数组,dp[n-1][k-1]表示前n个块,有k个不同难度的取法,Cnk=dp[n-1][k-1]*number+dp[n-1][k](包括前n块和第n块)对于第n块元素,可以选,也可以不选,那么分析出最后的答案一定包含第n块答案和不包含第n块答案,两种加起来才是最后的答案
第一种取第n块中的元素,就是dp[n-1][k-1]。
第二种不取的话,是dp[n-1][k],那么最后的结果就是dp[n][k]=dp[n-1][k-1]*number+dp[n-1][k]。
从中我们可以知道,想得到i的情况,总是从i-1得到,之后递推是i-2,i-3,…0,所以我们只需要知道dp[0][0],dp[0][1]的信息就可以递推出dp[1][1]的信息,以此类推。dp[i][j]中,j的值最大不可能超过i。
程序代码
实验结果
期末测试JAVA版
最新推荐文章于 2024-05-27 21:26:10 发布