题目描述
在怪物猎人这一款游戏中,玩家可以通过给装备镶嵌不同的装饰珠来获取 相应的技能,以提升自己的战斗能力。
已知猎人身上一共有 6 件装备,每件装备可能有若干个装饰孔,每个装饰孔有各自的等级,可以镶嵌一颗小于等于自身等级的装饰珠 (也可以选择不镶嵌)。
装饰珠有 M 种,编号 1 至 M,分别对应 M 种技能,第i种装饰珠的等级为 L_i只能镶嵌在等级大于等于 L_i的装饰孔中。对第i种技能来说,当装备相应技能的装饰珠数量达到 K_i 个时,会产生 W_i(K_i)的价值。镶嵌同类技能的数量越多,产生的价值越大,即 W_i(K_i − 1) < W_i(K_i)。但每个技能都有上限 P_i(1≤Pi≤7),当装备的珠子数量超过 P_i时,只会产生 W_i(P_i)的价值。
对于给定的装备和装饰珠数据,求解如何镶嵌装饰珠,使得 6 件装备能得到的总价值达到最大。

01背包式的动规划问题的一个变式。可以建立一个以装备装饰孔孔号为横轴,以装备号为纵轴的二维表格(数组)如下图:

表格中存放在该孔位的装饰珠序号。先把录入内存的装饰珠按升序排序,再遍历二维数组中的装饰孔。
对于每个装饰孔:
1.判断当前装饰珠的Level是否适合其孔位Level,如果不适合,则break(因为装饰珠等级升序排序,后续的装饰珠等级必定大于该装饰孔);
2.记录此时装备总价值
3.导入下一个装饰珠
4.记录装备价值,并与上一个进行比较,保留价值更大的
5.循环至遍历完成全部该装饰孔可用的装饰珠

Java代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;public class Zsz {static int M;static int[][] Wrecord;public static void main(String[] args) {int[][] equipment = new int[6][];int[][] record = new int[6][];Scanner scanner = new Scanner(System.in);for (int i = 0; i < 6; i++) {int n = scanner.nextInt();//当前装备装备孔的数量int[] temp = new int[n];//记录每个装备孔的等级for (int j = 0; j < temp.length; j++) {temp[j] = scanner.nextInt();}equipment[i] = temp;record[i] = new int[n];}M = scanner.nextInt();//装饰珠的种类数量ArrayList<int[]> W = new ArrayList<>();//记录装饰珠数量对应价值Wrecord = new int[M][];for (int i = 0; i < M; i++) {int Level = scanner.nextInt();int P = scanner.nextInt();//装饰珠数量上限int[] temp = new int[P + 1];temp[0] = Level;//数组首位是装饰珠等级for (int j = 1; j < temp.length; j++) {temp[j] = scanner.nextInt();}Wrecord[i] = temp.clone();int[] temp1 = new int[P + 2];for (int j = 0; j < temp.length; j++) {temp1[j] = temp[j];}temp1[temp1.length - 1] = i;//temp1最后一位装的是装饰珠编号-1W.add(temp1);}//对装饰珠进行排序Comparator<int[]> comparator = new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0] - o2[0];//升序排序}};Collections.sort(W, comparator);//开始推导for (int i = 0; i < 6; i++) {for (int j = 0; j < equipment[i].length; j++) {int Level = equipment[i][j];//当前孔位等级//开始尝试安插装饰珠//安插一个等级最小的record[i][j] = W.get(0)[W.get(0).length - 1] + 1;int value = Value(record);for (int k = 1; k < W.size(); k++) {int[] recordOfW = W.get(k);if (recordOfW[0] > Level){//装饰孔的等级小于装饰珠的等级break;//等级升序排序,后续的装饰珠等级必定大于装饰孔}int buffer = record[i][j];int nextRecordIJ = recordOfW[recordOfW.length - 1] + 1;record[i][j] = nextRecordIJ;int nextValue = Value(record);if (nextValue >= value){//数值保留value = nextValue;}else {//数值还原record[i][j] = buffer;}}//record[i][j]中保留的是最优解}}System.out.println(Value(record));}public static int Value(int[][] record){int value = 0;int[] CountOfZhuang = new int[M + 1];for (int i = 0; i < record.length; i++) {for (int j = 0; j < record[i].length; j++) {if (record[i][j] == 0){//doNothing}else {CountOfZhuang[record[i][j]]++;}}}for (int i = 1; i < CountOfZhuang.length; i++) {if (CountOfZhuang[i] == 0){continue;}if (CountOfZhuang[i] > Wrecord[i - 1].length - 1){//装饰珠的数量超出上限value += Wrecord[i - 1][Wrecord[i - 1].length - 1];}else {value += Wrecord[i - 1][CountOfZhuang[i]];}}return value;}
}

蓝桥杯-2020-Java-B组-装饰珠-动态规划相关推荐

  1. 2022年第十三届蓝桥杯比赛Java B组 【全部真题答案解析-第一部分】

    最近回顾了Java B组的试题,深有感触:脑子长时间不用会锈住,很可怕. 兄弟们,都给我从被窝里爬起来,赶紧开始卷!!! 2022年第十三届蓝桥杯Java B组(第一部分 A~F题) 目录 一.填空题 ...

  2. java判断44数组是否是4阶幻方_2015蓝桥杯决赛Java A组 第二题--四阶幻方

    //把1~16的数字填入4x4的方格中,使得行.列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方. // //四阶幻方可能有很多方案.如果固定左上角为1,请计算一共有多少种方案. //比如: ...

  3. java蓝桥杯dfs_第七届 蓝桥杯决赛 Java B组 打靶 解题报告(DFS,回溯,全排列)-Go语言中文社区...

    题目: 打靶 小明参加X星球的打靶比赛. 比赛使用电子感应计分系统.其中有一局,小明得了96分. 这局小明共打了6发子弹,没有脱靶. 但望远镜看过去,只有3个弹孔. 显然,有些子弹准确地穿过了前边的弹 ...

  4. 蓝桥杯------2017 Java B组 国赛:第二题 生命游戏

    题目描述: 康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机.   这个游戏在一个无限大的2D网格上进行. 初始时,每个小方格中居住着一个活着或死了的细胞. 下一时刻每个细胞的状态 ...

  5. 第十一届蓝桥杯 2020年国赛真题及解析 (Java 大学B组)

    第十一届蓝桥杯 2020年国赛真题 Java 大学B组 A 美丽的 2 B 扩散 C 阶乘约数 D 本质上升序列 E 玩具蛇 F 蓝肽子序列 ​G 皮亚诺曲线距离 H 画廊 I 补给 J 质数行者 所 ...

  6. 2020年 第11届 蓝桥杯 C/C++ B组 省赛真题详解及小结【第1场省赛2020.7.5】【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  7. 2020年软件类第十一届蓝桥杯 省赛 python组(人生苦短,我用python)

    2020年软件类第十一届蓝桥杯 省赛 python组 题解 文章目录 2020年软件类第十一届蓝桥杯 省赛 python组 题解 试题 A: 门牌制作 试题 B: 寻找 2020 试题 C: 跑步训练 ...

  8. 2020第十一届蓝桥杯省赛C组第一场

    2020第十一届蓝桥杯省赛C组第一场 试题 A: 指数计算 问题描述 题解 试题 B: 解密 问题描述 题解 试题 C: 跑步训练 问题描述 题解 试题 D: 合并检测 问题描述 题解 试题 E: R ...

  9. 2020年第十一届蓝桥杯决赛JAVA B G题“皮亚诺曲线距离“

    2020年第十一届蓝桥杯决赛JAVA B G题"皮亚诺曲线距离" 2020国赛 JAVA B组 个人题解目录 [问题描述] 皮亚诺曲线是一条平面内的曲线. 下图给出了皮亚诺曲线的 ...

  10. java dfs算法蓝桥杯题_【蓝桥杯省赛JavaB组真题详解】四平方和(2016)_疼疼蛇的博客-CSDN博客...

    原文作者:疼疼蛇 原文标题:[蓝桥杯省赛JavaB组真题详解]四平方和(2016) 发布时间:2021-02-26 15:00:01 题目描述 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数 ...

最新文章

  1. 计算机视觉方向简介 | 自动驾驶中的车道线跟踪技术
  2. 共模电感适用的频率_分析共模电感和差模电感寄生电容抵消的方法
  3. SpringMVC+RestFul详细示例实战教程
  4. 利用HTTP watch观察SAP CRM WebClient UI popup window
  5. 配置节处理程序时出错,未能加载文件或程序集
  6. 【二维差分】Monitor
  7. 美法院起诉黑客组织成员 为暴雪服务器攻击者
  8. 浅谈测试职业的发展空间
  9. PTA 程序设计天梯赛(101~120题)
  10. 拉里·佩奇 密歇根大学演讲
  11. 盘点2021年10个顶级数据分析软件,及优缺点对比
  12. Python 进阶 — Flake8 静态代码检查工具
  13. 项目之间Cookie的共享
  14. 汽车照明全国产化电子元件推荐方案
  15. 电脑上传,提高电脑上传速度 怎么提高文件上传速度
  16. 佩奇:产品经理要一个佩奇,不知道啥是佩奇的开发该怎么办?
  17. 软件一般是用什么语言开发的
  18. 你玩过轻量系统软总线应用吗?
  19. win7计算机个性化,win7系统桌面右击不显示个性化选项的解决方法
  20. 关于Navicat连接mysql数据库报host XXXXXXX is not allowed to connect to this mysql server

热门文章

  1. Cadence (Allegro) 转 Altium Designer
  2. FreeSWITCH对接SIP中继 语音外呼电话机器人 配置技术指导 www.ruikesoft.com
  3. XCTF_MOBILE10_easy-dex
  4. 【QCA6174】SDX12 WiFi QCA6174 bdwlan30.bin和bdwlan30.txt相互转化操作说明
  5. ecshop去所有版本+模板堂标记
  6. 第二章 2.3 计算机语言《2022年斯坦福AI指数报告》中文全解读
  7. PXIe背板 全混合8槽 4 Link架构 系统带宽14GB/s 单槽4GB/s
  8. 前端上传图片到oss对象存储
  9. C语言:偶数阶魔方阵的实现(四的倍数)
  10. 并发编程四 synchronized详解