打砖块(brike)
链接:https://ac.nowcoder.com/acm/problem/210249
来源:牛客网
题目
在一个凹槽中放置了\ n n 层砖块,最上面的一层有\ n n 块砖,第二层有\ n-1 n−1块,……最下面一层仅有一块砖。第 \ i i 层的砖块从左至右编号为1,2,\dots i1,2,…i,第i层的第j块砖有一个价值a[i,j](a[i,j]\leq 50)a[i,j](a[i,j]≤50)。下面是一个有5层砖块的例子:
如果你要敲掉第 \ i i层的第 \ j j 块砖的话,若 \ i=1 i=1,你可以直接敲掉它,若\ i>1 i>1,则你必须先敲掉第 \ i-1 i−1 层的第j和第\ j+1 j+1 块砖。
你的任务是从一个有n(n\leq 50)n(n≤50)层的砖块堆中,敲掉 (m\leq 500)(m≤500)块砖,使得被敲掉的这些砖块的价值总和最大。
解析
要选 a [ i ] [ j ] a[i][j] a[i][j]那么至少要选 a [ i − 1 ] [ j + 1 ] a[i-1][j+1] a[i−1][j+1]
所以对于每个 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k]打完了第i行j列的那块砖,一共打了k块砖
d p [ i ] [ j ] [ k ] = m a x ( d p [ l ] [ j + 1 ] [ k − i ] + p r e [ i ] [ j ] , d p [ i ] [ j ] [ k ] ) ; ( i − 1 < = l < = n − j ) dp[i][j][k] = max(dp[l][j+1][k-i] + pre[i][j],dp[i][j][k]); (i-1 <= l <= n - j) dp[i][j][k]=max(dp[l][j+1][k−i]+pre[i][j],dp[i][j][k]);(i−1<=l<=n−j)
其中
p r e [ i ] [ j ] pre[i][j] pre[i][j]表示第j列第1行到第i行的砖块分数和
注意状态转移过程中
0 < = i < = n − j + 1 0 <= i <= n - j + 1 0<=i<=n−j+1
为啥i = 0 也要更新?因为存在最优解,第j列一块砖块都不打,但是j + x列,和j - y列打了的情况,所以要求dp[0][j][k]把的值,把值传递到j - y列
洛谷中这道题砖块数范围更大,dp数组开大点就行了
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 55;
ll dp[N][N][502];ll a[N][N];
ll pre[N][N];//前缀和int main(){memset(dp, 0x8f, sizeof dp);//每个字节都是0x8f,所以dp[i][j][k]一定都是负数int n,m; cin >> n >> m;for(int i = 1; i <= n; ++i)for(int j = 1; j <= n + 1 - i; ++j)cin >> a[i][j];for(int i = 1; i <= n; ++i)for(int j = 1; j <= n + 1 - i; ++j)pre[i][j] = pre[i-1][j] + a[i][j];dp[0][n + 1][0] = 0;for(int j = n; j; --j)for(int i = 0; i <= n - j + 1; ++i)// 为啥i = 0 也要更新?要考虑 第j列一个都不选的情况,需要通过dp[0][j][l]把值传递过去for(int k = i*(i + 1)/2; k <= m; ++k){ll t = -1e9;for(int l = max(i - 1,0); l <= n + 1 - (j + 1); ++l)t = max(t,dp[l][j + 1][k-i]);dp[i][j][k] = max(t + pre[i][j],dp[i][j][k]);}ll ans = 0;for(int i = 1; i <= n; ++i)for(int j = 1; j <= n - i + 1 ; ++j)ans = max(ans,dp[i][j][m]);cout << ans ;return 0;
}
打砖块(brike)相关推荐
- Python游戏开发,pygame模块,Python实现打砖块小游戏
前言: 本期我们将利用python制作一个打砖块小游戏,废话不多说,让我们愉快地开始吧~ 效果展示 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RdjcY4gn-16 ...
- c语言 打砖块,打砖块
打砖块游戏 问题分析: 需要做哪些模块 绘制砖块与小球 绘制木板,木板用键盘控制 物理引擎,小球的运动以及小球的反射 消除砖块 回顾一下图形绘制的基础知识 /********************* ...
- echarts树点击label事件_ECharts 堆积木(砖块)游戏
最近突发奇想,用 3D 的堆叠柱图,做了一个搭积木的小游戏. 主要思路 用一个几乎透明的 series-bar3D 铺满整个 grid3D,作为操作区,监听鼠标点击事件.完成堆积木的操作: 用多层数据 ...
- python小游戏代码大全-Python实现打砖块小游戏代码实例
这次用Python实现的是一个接球打砖块的小游戏,需要导入pygame模块,有以下两条经验总结: 1.多父类的继承2.碰撞检测的数学模型 知识点稍后再说,我们先看看游戏的效果和实现: 一.游戏效果 二 ...
- 俄罗斯方块游戏笔记(一)——砖块样式配置窗体
一.砖块样式配置窗体 第一步 双击lbl的paint事件 第二步 双击lblMode的MouseClick 自定义界面反思: 要想改变Label的大小,AutoSize属性必须改. 不能在第一步后将G ...
- RL之DQN:基于TF训练DQN模型玩“打砖块”游戏
RL之DQN:基于TF训练DQN模型玩"打砖块"游戏 目录 输出结果 设计思路 训练过程 输出结果 1.test01 2.test02 设计思路 训练过程 后期更新--
- 项目: 用easyx实现消砖块
目录 一.最终效果展示 二.绘制静态的挡板 三.控制挡板 四.消砖块 五.鼠标交互 一.最终效果展示 效果图如下: 这个项目还是有很多的细节漏洞的.例如: 边界控制这里还是有点问题的. 二.绘制静态的 ...
- 项目: 用数组实现反弹球消砖块
项目:用数组实现反弹球消砖块 一.效果展示: 二.代码如下: 一.效果展示: 二.代码如下: #include<stdio.h> #include<string.h> #inc ...
- 项目: 用函数实现反弹球消砖块
目录 一.项目描述和最终的成果展示 二.封装后的弹跳小球 三.显示移动挡板 四.反弹小球 五.添加砖块并实现打砖块操作 一.项目描述和最终的成果展示 这是在上一次弹跳小项目上进行了一系列的优化和封装. ...
最新文章
- Android系统Google Maps开发实例浅析
- MT-Retina.js
- 一部手机是否能用 7 年?苹果、三星、Google:三年差不多!
- php按照二维数组某个字段排序,PHP 二维数组根据某个字段排序
- Go内存管理之代码的逃逸分析
- sklearn.preprocessing之数据预处理
- 强大的.NET反编译工具Reflector及插件 (转)
- Java异步多线程编程探索之CompletableFuture
- filezilla linux服务器端,FileZilla Server安装配置教程
- 为什么说数据不动代码动?移动计算比移动数据更划算?
- 二頌(金火互易過程)
- 关闭windows电脑 ctrl +alt +方向键旋转屏幕快捷键
- C++ 的图形界面(UI)库
- 在M文件中使用模糊工具箱fis文件
- 怎么注册公司邮箱?公司邮箱注册流程介绍
- 场效应晶体管在电路中的五大作用,你了解哪一种?
- 懂得放弃,才会拥有!
- YouTube 创始人陈士骏,成立了一支由 AI 决策的对冲基金
- 2016 google machine translation 英译中
- Linux 系统黑洞 /dev/null
热门文章
- 入职体检时为什么要检查血常规
- GUC-10 线程八锁
- 大白话讲解JDK源码系列:从头到尾再讲一遍ThreadLocal
- ERP项目文档--想到用时方恨少
- 巨人网络纽交所上市揭幕 市值将望超过盛大网易
- matlab 工具箱查询,matlab常用工具箱、函数查询及相关应用
- wordpress主题html5,Salutation 强大的HTML5商务WordPress主题集成BuddyPress[更新至v3.0.7]
- OpenStack_Rocky版-8.安装Dashboard面板服务
- 基于rabbitmq延迟插件实现分布式延迟任务
- 宝马335i手动挡和M3手动挡的对比