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

NOIP2023模拟8联测29 C. 蛋糕

NOIP2023模拟8联测29 C. 蛋糕

文章目录

  • NOIP2023模拟8联测29 C. 蛋糕
    • 题目大意
    • 思路
    • code

题目大意

你现在得到了一个二维蛋糕,它从左到右可以分成 n n n 列,每列高为 a i a_i ai 。对于每一列,又可以从下到上分为 a i a_i ai 块,并且最上面一块权值为 1 1 1 ,从上到下权值依次加 。每一列的最上面的权值为 的块的上表面有“奶油”。

你现在要把这一个蛋糕分成若干个矩形,要求每一个矩形上都要有“奶油”,也即每个矩形要包含至少一个权值为 1 1 1 的块。显然蛋糕中的每一格都必须被划分到恰好一个矩形内,且矩形不能包含没有蛋糕的格子。

定义每一块矩形的代价为其每一行的最大值之和,即 ∑ i = l r ( max ⁡ j − = d u v i , j ) \sum_{i = l}^r(\max_{j -= d}^u v_{i , j}) i=lr(maxj=duvi,j) 。特别地,对于宽(列数)为 1 1 1 的矩形,代价为矩形内权值的最大值。请你最小化划分整个蛋糕的代价。

n ≤ 3000 n\le 3000 n3000

思路

考虑维护区间最大值和最小值的位置。

然后搞一个 d p l , r , k dp_{l , r , k} dpl,r,k 表示区间 [ l , r ] [l , r] [l,r] 内从下往上前 k k k 层的最小代价。

通过一通推理发现,对于一个区间 [ l , r ] [l , r] [l,r] 的最优策略就是删除最高的那一列或者把区间的所有蛋糕删到最矮的那一列那么高。

搞一个记忆化就好了

code

#include <bits/stdc++.h>
#define LL long long
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
using namespace std;
const int N = 3005;
int n , min1[N][N] , max1[N][N];
LL a[N];
map<LL , LL> dp;
LL gt (LL l , LL r , LL k) { return (l * (N + 1) + r) * N + k; }
LL getsum (LL x , LL y) { return (x + y) * (y - x + 1) / 2; }
LL solve (int l , int r , LL k) {LL id = gt (l , r , k);if (dp.count (id)) return dp[id];int mxd = max1[l][r] , mnd = min1[l][r];LL ans = a[mxd] - k;if (mxd > l) ans += solve (l , mxd - 1 , k);if (mxd < r) ans += solve (mxd + 1 , r , k);if (l != r) {LL ans1 = getsum (a[mxd] - a[mnd] + 1 , a[mxd] - k);if (l < mnd) ans1 += solve (l , mnd - 1 , a[mnd]);if (mnd < r) ans1 += solve (mnd + 1 , r , a[mnd]);ans = min (ans , ans1);}return dp[id] = ans;
}
int main () {freopen ("cake.in" , "r" , stdin);freopen ("cake.out" , "w" , stdout);scanf ("%d" , &n); fu (i , 1 , n) {scanf ("%lld" , &a[i]);}fu (l , 1 , n) {min1[l][l] = max1[l][l] = l;fu (r , l + 1 , n) {min1[l][r] = min1[l][r - 1] , max1[l][r] = max1[l][r - 1];if (a[min1[l][r - 1]] > a[r]) min1[l][r] = r;if (a[max1[l][r - 1]] < a[r]) max1[l][r] = r;}}
//	return 0;printf ("%lld" , solve (1 , n , 0));return 0;
}

相关文章:

  • 【Django】项目模型
  • 第四章 应用SysML基本特性集的汽车示例 P2(断更)|系统建模语言SysML实用指南学习
  • MATLAB算法实战应用案例精讲-【图像处理】机器视觉(基础篇)(八)
  • CSS3中的字体和文本样式
  • FreeRTOS_信号量之互斥信号量
  • 【SA8295P 源码分析 (一)】114 - 将Android GVM userdata文件系统从 EXT4 修改为 F2FS
  • PyG edge index 转换回 邻接矩阵
  • element-plus的el-tag标签关闭标签时的高亮显示逻辑
  • Ubuntu GCC切换源
  • echarts 地图迁徙与地图下钻
  • MySQL教程笔记
  • SpringBoot / Vue 对SSE的基本使用
  • springboot整合日志,并在本地查看
  • [PHP]pearProject协作系统 v2.8.14 前后端
  • Elasticsearch 集群分片出现 unassigned 其中一种原因详细还原
  • 【译】JS基础算法脚本:字符串结尾
  • Cookie 在前端中的实践
  • docker-consul
  • E-HPC支持多队列管理和自动伸缩
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JavaScript标准库系列——Math对象和Date对象(二)
  • PHP的类修饰符与访问修饰符
  • Promise面试题2实现异步串行执行
  • Python打包系统简单入门
  • QQ浏览器x5内核的兼容性问题
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • vue 个人积累(使用工具,组件)
  • - 概述 - 《设计模式(极简c++版)》
  • 给第三方使用接口的 URL 签名实现
  • 技术发展面试
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 在Unity中实现一个简单的消息管理器
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 选择阿里云数据库HBase版十大理由
  • # 透过事物看本质的能力怎么培养?
  • $GOPATH/go.mod exists but should not goland
  • (1)STL算法之遍历容器
  • (2015)JS ES6 必知的十个 特性
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (二)JAVA使用POI操作excel
  • (七)Java对象在Hibernate持久化层的状态
  • (三)终结任务
  • (一)80c52学习之旅-起始篇
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)Linux网络编程入门
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • ./configure、make、make install 命令
  • .describe() python_Python-Win32com-Excel
  • .htaccess配置常用技巧
  • .jks文件(JAVA KeyStore)
  • .NET与java的MVC模式(2):struts2核心工作流程与原理