期末测试JAVA版

这是老师在算法课上布置的一道算法题目,有关动态规划
问题描述: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。
程序代码
在这里插入图片描述
在这里插入图片描述
实验结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值