当前位置: 首页 > news >正文

小明打砖块-算法

题目

最近做了小米2024年的笔试题-小明打砖块,类似于开心消消乐,对于相邻的相同砖块可选择一消,二消,三消。一消得分a,二消得分b,三消得分c,求所有砖块的最高得分。

题目链接:小明打砖块_牛客题霸_牛客网

解法

对于n个砖块,假设最高得分为maxScore(n),那么n+1个砖块时,对于最后一个砖块而言有三种选择方案:

① 单消

这种情况 score(n + 1) =  maxScore(n) + a

② 双消

此时 score(n + 1) = maxScore(y) + maxScore(y + 1 ~ n) + b

③ 三消

此时 score(n + 1) = maxScore(x - 1) + maxScore(x + 1 ~ y - 1) + maxScore(y + 1 ~ n) + c

因此只需要对这三种情况求出最大值就是maxScore(n + 1)

采用区间dp的思想,用dp[ i ][ j ]代表砖块下标[ i ,  j ]范围内能够获得的最高得分,求出dp后只需返回dp[0][n - 1]就是最终结果

代码实现 

import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);while(in.hasNext()) {//  砖块数量int brickSize = in.nextInt();//  消消乐得分int fade1 = in.nextInt(), fade2 = in.nextInt(), fade3 = in.nextInt();int[] bricks = new int[brickSize];for(int i = 0; i < brickSize; i++) {bricks[i] = in.nextInt();}//  动态规划//  dp[i][j]代表下标[i, j]范围内砖块的最优解int[][] dp = new int[brickSize][brickSize];for(int j = 0; j < brickSize; j++) {for(int i = 0; i <= j; i++) {//  一消dp[i][j] = fade1 + (j - 1 >= 0 ? dp[i][j - 1]: 0);//  二消if(j - i >= 1) {//  找到前一个与bricks[i]相同的元素int preIdx = j - 1;while (preIdx >= i){while(preIdx >= i && bricks[preIdx] != bricks[j]) {preIdx--;}if(preIdx >= i) {int sec1 = preIdx - 1 >= 0 ? dp[i][preIdx - 1] : 0;int sec2 = preIdx + 1 < j ? dp[preIdx + 1][j - 1] : 0;int fade2Ans = sec1 + sec2 + fade2;dp[i][j] = Math.max(dp[i][j], fade2Ans);preIdx--;}}}//  三消if(j - i >= 2) {//  找到前一个与bricks[i]相同的元素int preIdx = j - 1;while (preIdx >= i) {while(preIdx >= i && bricks[preIdx] != bricks[j]) {preIdx--;}if(preIdx >= i) {int prePreIdx = preIdx - 1;while (prePreIdx >= i) {while(prePreIdx >= i && bricks[prePreIdx] != bricks[j]) {prePreIdx--;}if(prePreIdx >= i) {int sec1 = prePreIdx - 1 >=0 ? dp[i][prePreIdx - 1] : 0;int sec2 = prePreIdx + 1 < preIdx ? dp[prePreIdx + 1][preIdx - 1]: 0;int sec3 = preIdx + 1 < j ? dp[preIdx + 1][j - 1] : 0;int fade3Ans = sec1 + sec2 + sec3 + fade3;dp[i][j] = Math.max(dp[i][j], fade3Ans);prePreIdx--;}}preIdx--;}}}}}System.out.println(dp[0][brickSize - 1]);}}
}

http://www.dtcms.com/a/392891.html

相关文章:

  • 【Open3D】在Conda环境下安装Open3D | Anaconda | VSCode
  • AWS 的存储方案全对比:EBS、S3、EFS 用在哪?
  • 【实证分析】上市公司债务违约风险KMV模型及违约距离(2000-2023年)
  • 【牛客网】dd爱科学 最长非递减子序列 二分查找
  • vmware安装uos v20无法识别网卡
  • 力扣hot100 | 动态规划1 | 70. 爬楼梯、118. 杨辉三角、198. 打家劫舍、279. 完全平方数、322. 零钱兑换
  • 每天五分钟深度学习:softmax回归的交叉熵损失的前向传播
  • leetcode算法刷题的第四十天
  • 算法基础篇(3)高精度
  • Java Log
  • 最常见的MCP服务
  • 如何安装tomcat服务器以及如何解决服务器的乱码问题
  • 软考中级习题与解答——第九章_信息安全(1)
  • 小迪安全v2023学习笔记(八十五讲)—— APP攻防反证书反代理反模拟器绕过XP框架
  • Oracle VM 设置CentOS7网络
  • lua代码解析1
  • C++特性之构造函数,析构函数和虚析构函数
  • 走进Linux的世界:gdb的使用
  • SCADE One vs Scade 6 - CNN池化层建模对比
  • uniapp | u-waterfall实现瀑布流商品列表(支持筛选查询)
  • C++优选算法精选100道编程题(附有图解和源码)
  • 五分钟系列-nm工具
  • 【龙泽科技】新能源汽车空调系统结构原理仿真教学软件
  • 设计一个图片上传服务,支持每秒5000张图片上传,并且要实时生成多种尺寸的缩略图。你觉得架构设计的要点有哪些?
  • NLP:Transformer优势详解
  • 基于SpringBoot+Vue的民宿管理系统(WebSocket及时通讯、腾讯地图API、支付宝沙盒支付、ECharts图形化分析)
  • Git版本管理工具入门及常用命令讲解---小白版
  • 芯脉:面向高速接口的SoC架构与完整性设计<2-2>
  • Go基础:Go语言流程控制详解
  • 【硬件-笔试面试题-103】硬件/电子工程师,笔试面试题(知识点:项目当中无人机的控制是怎么实现的)