【总结】【模板】2021年寒假集训前期总结

2024-03-12 18:48

本文主要是介绍【总结】【模板】2021年寒假集训前期总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 0x00 前言
    • 0x01 单调队列优化 DP
    • 0x02 斜率优化 DP

0x00 前言

学了 DP 的优化和搜索的优化,说实话真的没什么可以总结的,但是还是强行安了几个模板,有的版块确实总结不出什么模板了,就暂且咕咕咕掉吧。。。

0x01 单调队列优化 DP

首先还是要写出 dp 式

一般是一个两重循环

第一重循环枚举阶段,第二重循环枚举前面的并更新后面

大致就是这样的:

d p i = m i n ( j − k + 1 ) → j { f ( i ) + g ( j ) } dp_i=\mathrm{min}_{(j-k+1)\to j}\{f(i)+g(j)\} dpi=min(jk+1)j{f(i)+g(j)}

其中 f ( i ) f(i) f(i) g ( j ) g(j) g(j),分别表示的是与 i i i j j j 有关的多项式/单项式

至于 k k k,由题目而定

由于 i i i 在这个阶段是固定的,所以把 f ( i ) f(i) f(i) 给分离出来

d p i = m i n ( j − k + 1 ) → j { g ( j ) } + f ( i ) dp_i=\mathrm{min}_{(j-k+1)\to j}\{g(j)\}+f(i) dpi=min(jk+1)j{g(j)}+f(i)

然后对于 g ( i ) g(i) g(i),即是求一个区间最小

直接套用单调队列就行了

int head=1,tail=1;
for(int i=1;i<=n;i++){if(i-k>q[head] && head<=tail){head++;}while(g(i)>g(q[tail]) && head<=tail){//这里的g(i)按题而定tail--;}用q[head]当做原本的j去更新dp[i];q[++tail]=i;
}

0x02 斜率优化 DP

推柿子是有点复杂,但最后套用模板是挺方便

由于题目千遍万化,没有办法直接表示,所以就以一道版题为例:

打印文章:

  • 首先,写出dp式: d p i = m i n ( d p j + ( s u m i − s u m j ) 2 + m ) dp_i=min(dp_j+(sum_i-sum_j)^2+m) dpi=min(dpj+(sumisumj)2+m) s u m i sum_i sumi 表示的是前缀和

  • 然后不妨设 k k k转移过劳 比 j j j 转移过来优,且 k k k j j j 后面


  • d p j + ( s u m i − s u m j ) 2 + m ≥ d p k + ( s u m i − s u m k ) 2 + m dp_j+(sum_i-sum_j)^2+m \geq dp_k+(sum_i-sum_k)^2+m dpj+(sumisumj)2+mdpk+(sumisumk)2+m

  • 然后对上面这个不等式化简,注意 k k k j j j 后,所以 s u m k ≥ s u m j sum_k \geq sum_j sumksumj

  • ( s u m k 2 + d p k ) − ( s u m j 2 + d p j ) s u m k − s u m j ≥ 2 s u m i \frac{(sum_k^2+dp_k)-(sum_j^2+dp_j)}{sum_k-sum_j} \geq 2sum_i sumksumj(sumk2+dpk)(sumj2+dpj)2sumi

于是上面这个是分子,下面这个是分母,右边那个是R(i),盲猜是维护一个下凸壳(因为如果不是的话是无法套这个模板的)

#include<cstdio>
#include<iostream>
#include<cmath> 
using namespace std;
const int MAXN=500005;
int n,m,q[MAXN],s[MAXN],dp[MAXN];
int getson(int k,int j){//do sth.
}
int getmon(int k,int j){//do sth.
}
int main(){int n,m;//init int head=1,tail=1;for(int i=1;i<=n;i++){while(head<tail && getson(q[head],q[head+1])<=R(i)*getmon(q[head],q[head+1])){head++;}dp[i]=dp[q[head]]+(s[i]-s[q[head]])*(s[i]-s[q[head]])+m;//这里使用q[head]当作暴力中的j去更新dp[i]while(head<tail && getson(q[tail],i)*getmon(q[tail-1],q[tail])<=getson(q[tail-1],q[tail])*getmon(q[tail],i)){tail--;}q[++tail]=i;}printf("%d\n",dp[n]);
return 0;
}

这篇关于【总结】【模板】2021年寒假集训前期总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802239

相关文章

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义