CodeTON Round 8 D. Learning to Paint 【DP求前k大】

D. Learning to Paint

1

题意

有一个 n n n 个格子长度的条带,格子从左到右编号为 1 → n 1 \rarr n 1n,可以选择若干子段(或不选)的格子,给定一个二维数组 a a a
每选择一个 [ l i , r i ] [l_i,r_i] [li,ri] 子段,获得的价值 a [ l i ] [ r i ] a[l_i][r_i] a[li][ri]

问任意选择方案中,前 k k k 大的价值是多少?(输出 k k k 个价值)

思路

如果我们在当前位置 i i i 枚举最后一个选择的区间 [ l , r ] [l,r] [l,r],那么很显然我们 1 → i 1 \rarr i 1i 的前 k k k 大可以从 1 → ( l − 2 ) 1 \rarr (l - 2) 1(l2) 转移过来,这里是一个 子状态

考虑 D P DP DP,我们定义 d p i dp_i dpi [ 1 , i ] [1,i] [1,i] 的所有选择方案中,前 m i n ( 2 i , k ) min(2 ^ i, k) min(2i,k) 大的价值,并且将这些价值按非递增排列,那么在我们枚举最后一个区间时,我们可以从 d p [ l − 2 ] dp[l - 2] dp[l2] 转移过来, l − 1 l- 1 l1 不能选是因为选了之后会和最后一个区间并上,那么最后一个区间就不是 [ l , i ] [l,i] [l,i] 而是 [ l − 1 , i ] [l - 1, i] [l1,i]

如果我们在每个位置 i i i,枚举最后一个区间,暴力转移,复杂度可达 O ( n 2 ⋅ k log ⁡ k ) O(n^2 \cdot k \log k) O(n2klogk)

我们进一步观察发现,只需要选 m i n ( 2 i , k ) min(2 ^ i, k) min(2i,k) 个,其他很多价值都是多余的,并且每个位置 d p [ j ] dp[j] dp[j] 的价值都是非递增排列,要选到后面的价值,前面的价值必须都要被选到!

这里就类似 B F S BFS BFS,我们只需要先将每个位置最大的价值加上对应的最后一个区间的 权重 放入优先队列,每次出队一个最大的价值,加入 d p [ i ] dp[i] dp[i] 中,并将相应位置 d p [ j ] dp[j] dp[j]下一个最大的价值入队,这样子一直处理到 d p [ i ] dp[i] dp[i] k k k 个元素,或者前面位置没有元素可供转移为止

时间复杂度: O ( n ⋅ ( n + k ) ⋅ log ⁡ k ) O(n \cdot (n + k) \cdot \log k) O(n(n+k)logk)
每个位置先将前 i i i 个位置最大值入队,然后出队 k k k 个元素

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;

const int INF=0x3f3f3f3f;
const long long INFLL=1e18;

typedef long long ll;

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t;
    std::cin >> t;
    while(t--){
        int n, k;
        std::cin >> n >> k;
        std::vector<std::vector<int>> a(n + 1, std::vector<int>(n + 1, 0));
        fore(i, 1, n + 1)
            fore(j, i, n + 1)
                std::cin >> a[i][j];
        std::vector<std::vector<int>> dp(n + 1, std::vector<int>());
        dp[0] = {0};
        
        fore(i, 1, n + 1){
            std::priority_queue<std::array<int, 3>> q; //value index rank
            q.push({dp[i - 1][0], i - 1, 0}); //i 不选
            fore(j, -1, i - 1) q.push({(j < 0 ? 0 : dp[j][0]) + a[j + 2][i], j, 0}); //负数防止越界

            while(!q.empty() && dp[i].size() < k){  //保证不超过k个值的同时,前面选择方案还有可选
                auto [v, idx, rk] = q.top();
                q.pop();
                dp[i].push_back(v);
                if(idx < 0 || rk + 1 == dp[idx].size()) continue;
                if(idx == i - 1) q.push({dp[idx][rk + 1], idx, rk + 1});
                else q.push({dp[idx][rk + 1] + a[idx + 2][i], idx, rk + 1});
            }
        }

        for(auto v : dp[n]) std::cout << v << ' ';
        std::cout << endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/506544.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5G无线接入网和接口协议

**部分笔记** 4.3无线协议架构 NR无线协议分为两个平面&#xff1a;用户面和控制面。 用户面&#xff08;UP&#xff09;:协议栈及用户数据采用的协议 控制面(Control Plane&#xff0c;CP)协议栈即系统的控制信令传输采用的协议簇。 虚线标注的是信令数据的流向。一个UE在…

[计算机效率] 文件加密工具:Lockdir

3.11 文件加密工具&#xff1a;Lockdir Lockdir是一款安全性高、使用简单、体积极小的便携式文件夹加密器&#xff0c;无需安装&#xff0c;一键加密&#xff0c;一键解密&#xff0c;加密算法高&#xff0c;是优秀的加密工具。其主要特点包括&#xff1a; 加密操作简易&#…

遥感动态监测技术

很多人对动态监测和动态检测两个名词有疑惑。我们可以这样理解&#xff0c;动态监测是一个广义的名词&#xff0c;泛指数据预处理、变化信息发现与提取、变化信息挖掘与应用等&#xff0c;以对整个流程的叙述。动态检测是一个狭义的名词&#xff0c;主要指部分数据预处理、变化…

Python | Leetcode Python题解之第4题寻找两个正序数组的中位数

题目&#xff1a; 题解&#xff1a; class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:def getKthElement(k):"""- 主要思路&#xff1a;要找到第 k (k>1) 小的元素&#xff0c;那么就取 pivot1 nums1[k…

需要给Word文档中的汉字注音,拼音要在汉字的右边 要怎么操作?两种方法一学就会

在Word文档中&#xff0c;为字体添加拼音是一个常见的需求&#xff0c;特别是在处理包含生僻字或需要标注拼音的文本时。下面&#xff0c;我们将详细介绍如何在Word文档中将拼音加到字体的右边。 方法一&#xff1a;使用“汇帮注音大师”给汉字加拼音加到右边 第一步&#xf…

快速排序---算法

1、算法概念 快速排序&#xff1a;通过一趟排序将待排记录分隔成独立的两部分&#xff0c;其中一部分记录的数据均比另一部分的数据小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到震哥哥序列有序。 快速排序的最坏运行情况是O()&#xff0c;比如说顺序数…

整数删除,蓝桥杯训练题

题目描述: 给定一个长度为 N 的整数数列&#xff1a;A1,A2,…,AN。 你要重复以下操作 K 次&#xff1a; 每次选择数列中最小的整数&#xff08;如果最小值不止一个&#xff0c;选择最靠前的&#xff09;&#xff0c;将其删除&#xff0c;并把与它相邻的整数加上被删除的数值。 …

【前端面试3+1】06继承方式及优缺点、缓存策略、url输入到渲染全过程、【二叉树中序遍历】

一、继承有哪些方式&#xff1f;以及优缺点 继承的方式包括原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承和组合式继承。 1.原型链继承&#xff1a; 实现方式&#xff1a;将子类的原型指向父类的实例来实现继承。优点&#xff1a;简单易懂&#xff0c;代码量少。…

linux 一些命令

文章目录 linux 一些命令fdisk 磁盘分区parted 分区文件系统mkfs 格式化文件系统fsck 修复文件系统 mount 挂载swap 交换分区清除linux缓存df du 命令raid 命令基本原理硬raid 和 软raid案例raid 10 故障修复&#xff0c;重启与卸载 lvm逻辑卷技术LVM的使用方式LVM 常见名词解析…

wavedec2函数及使用

在MATLAB中&#xff0c;进行小波分解及其逆运算是处理图像的一种常见方法&#xff0c;尤其适用于图像分析、压缩和去噪等场景。wavedec2函数可以对二维信号&#xff08;例如图像&#xff09;进行多级小波分解&#xff0c;而waverec2函数则用于进行相应的逆运算。以下是如何使用…

【树状数组专题】【蓝桥杯备考训练】:数星星、动态求连续区间和、一个简单的整数问题、一个简单的整数问题2【已更新完成】

目录 1、数星星&#xff08;《信息学奥赛一本通》 & ural 1028&#xff09; 思路&#xff1a; 基本思路&#xff1a; 树状数组经典三函数&#xff1a; 1、lowbit()函数 2、query()函数 3、add()函数 最终代码&#xff1a; 2、动态求连续区间和&#xff08;《信息学奥赛一本…

笔记本三屏异显方案——更新中,是否能够在FPGA上实现,淘宝购物的价格太贵

三屏是&#xff08;笔记本电脑屏幕&#xff0c;两个显示器屏幕&#xff09;&#xff0c;异显是采用屏幕的扩展功能&#xff0c;这样能够左边看视频文章&#xff0c;右边control cv代码。 一、 电脑有一个HDMI口的时候&#xff0c;只需要买一个TypeC&#xff08;雷电接口&#x…

ruoyi-nbcio-plus基于vue3的flowable任务监听器的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

基于Springboot点餐平台网站

采用技术 基于Springboot点餐平台网站的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 菜品评价管理 订单管理 前台首页 管理员登录 用户管理 菜品分…

MATLAB小波包分解及逆向操作

MATLAB代码 % 载入图像 grayImg imread(lena256.bmp); % 替换为你的图像路径% 选择小波函数和分解级别 waveletFunction db1; level 2;% 执行WPT正向分解 wp wpdec2(double(grayImg), level, waveletFunction);% 从小波包分解中重建图像&#xff08;逆向运算&#xff09; r…

【数字IC/FPGA】手撕代码:模3检测器(判断输入序列能否被3整除)

今天我们来手撕一个常见的笔试题&#xff0c;使用的方法是三段式Moore状态机。 题目描述&#xff1a; 输入端口是串行的1bit数据&#xff0c;每个时钟周期进来一位新数据后&#xff0c;实时检查当前序列是否能整除3&#xff0c;若能则输出1&#xff0c;否则输出0。 例如&#…

webpack搭建开发环境

webpack搭建开发环境 一.webpack开发模式二.webpack打包模式三.webpack打包模式应用四.Webpack 前端注入环境变量五.Webpack 开发环境调错 source map六. Webpack 设置解析别名路径七.优化-CDN的使用八.多页面打包九.优化-分割公共代码一.webpack开发模式 作用:启动 Web 服务…

亮数据,可视化数据采集强大利器

前言 随着信息技术的飞速发展&#xff0c;我们已经进入了一个以数据为中心的世纪。在这个时代&#xff0c;数据不仅仅是信息的载体&#xff0c;它已经成为了推动社会进步、创新科技、增强决策和驱动经济增长的关键资源。 在这个数据世纪中&#xff0c;掌握数据的能力等同于掌…

[计算机效率] 文件对比工具:Beyond Compare 4

3.10 文件对比工具&#xff1a;Beyond Compare 4 Beyond Compare 4是一款功能强大的文件和文件夹比较工具&#xff0c;它能够帮助用户在不同系统或版本之间快速比较和同步文件和文件夹。以下是Beyond Compare 4软件的一些主要特点&#xff1a; 文件和文件夹比较&#xff1a;Be…

普发Pfeiffer 真空TCP120-TCP380-TCP035-TCP600 使用手侧

普发Pfeiffer 真空TCP120-TCP380-TCP035-TCP600 使用手侧