洛谷题目传送门

貌似做所有的DP题都要先搞出暴力式子,再往正解上靠。。。

设\(f_{i,j}\)为前\(i\)个数分\(j\)段的最小花费,\(w_{l,r}\)为\([l,r]\)全在一段的费用。

\[f_{i,j}=\min\limits_{k=1}^{i}\{f_{k,j-1}+w_{k,i}\}
\]

显然\(j\)这一维可以滚掉,于是变成\(g_i=\min\limits_{k=1}^{i}\{f_k+w_{k,i}\}\)做\(m\)遍(题目中的\(k\))

这又是一个决策单调性优化的式子。还是决策二分栈吗?要不得了,因为就算知道\(i,k\)也没法直接算\(f_k+w_{k,i}\)。

再次推广蒟蒻的DP优化总结

分治。总结里的概述蒟蒻也懒得再㧟一遍了。。。就说说这题的实现细节吧。


\(L^AT_EX\)画图?(雾

求解区间:\(|\gets\)预处理\(\to|\) \(l\frac{\qquad\qquad\qquad\downarrow^{mid}\qquad\qquad\qquad}{}r\)

决策区间:\(L\frac{\qquad\qquad\qquad\qquad\downarrow^{k}\qquad\qquad\qquad}{}R\)


设当前的求解区间为\([l,r]\),最优决策区间\([L,R]\)。对于当前分治的中点\(mid\),我们需要在\([L,\min(R,mid)]\)中暴力找到最优决策\(k\)。注意到从\(w_{l,r}\)到\(w_{l,r+1}\)或者从\(w_{l,r}\)到\(w_{l+1,r}\)都是可以做到\(O(1)\)的,只要开一个桶记录当前区间每个颜色出现次数就可以啦。把指针\(i\)从\(L\)移到\(\min(R,mid)\)并不断的算\(f_i+w_{i,mid}\),最终可以找到\(k\)。

注意一点,当进入求解区间时,我们的应该要确保\([L,l-1]\)的信息的存在,这样才能保证分治的复杂度。

于是我们考虑进子问题之前如何先处理出子问题的答案。先看左边的子问题(\([l,mid-1],[L,k]\))显然和当前问题的\([L,l-1]\)是一样的。注意到我们在求\(k\)的时候对\(w\)和桶都做了修改,那么我们直接还原回来就可以进左子问题了。

而右子问题呢?(\([mid+1,r],[k,R]\))它要预处理的是\([k,mid]\),而当前的是\([L,l-1]\)。所以我们先把右端点指针从\(l-1\)移到\(mid\),桶和\(w\)都加上去,再把左端点从\(L\)移到\(k-1\),桶和\(w\)都减掉,接着进去就好了。回溯的时候还是要还原到\([L,l-1]\),因为上一层要接着用。

注意答案是long long级别的。

代码经过了精心排版(尤其是分治那一块)

#include<cstdio>
#include<cstring>
#define RG register
#define R RG int
#define G c=getchar()
typedef long long LL;
const int N=1e5+9;
int a[N],c[N];
LL ff[N],gg[N],*f=ff,*g=gg;
inline int in(){
RG char G;
while(c<'-')G;
R x=c&15;G;
while(c>'-')x=x*10+(c&15),G;
return x;
}
void solve(R l,R r,R kl,R kr,RG LL w){//kl,kr就是决策区间
if(l>r)return;//边界
R m=(l+r)>>1,k=0,p=m<kr?m:kr,i;
for(i= l;i<=m;++i)w+=c[a[i]]++;//求k
for(i=kl;i<=p;++i)w-=--c[a[i]],g[m]>f[i]+w?g[m]=f[i]+w,k=i:0;
for(i=kl;i<=p;++i)w+=c[a[i]]++;//还原
for(i= l;i<=m;++i)w-=--c[a[i]];
solve(l,m-1,kl,k,w);
for(i= l;i<=m;++i)w+=c[a[i]]++;//调整
for(i=kl;i< k;++i)w-=--c[a[i]];
solve(m+1,r,k,kr,w);
for(i=kl;i< k;++i)++c[a[i]];//再次还原
for(i= l;i<=m;++i)--c[a[i]];
}
int main(){
R n=in(),k=in();
RG LL*tmp;
for(R i=1;i<=n;++i)//第一次直接算
f[i]=f[i-1]+c[a[i]=in()]++;
memset(c,0,(n+1)<<2);
while(--k){
memset(g,1,(n+1)<<3);
solve(1,n,1,n,0);
tmp=f;f=g;g=tmp;
}
printf("%lld\n",f[n]);
return 0;
}

洛谷CF868F Yet Another Minimization Problem(动态规划,决策单调性,分治)的更多相关文章

  1. CF868F Yet Another Minimization Problem(决策单调性)

    题目描述:给定一个序列,要把它分成k个子序列.每个子序列的费用是其中相同元素的对数.求所有子序列的费用之和的最小值. 输入格式:第一行输入n(序列长度)和k(需分子序列段数).下一行有n个数,序列的每 ...

  2. Codeforces 868F. Yet Another Minimization Problem【决策单调性优化DP】【分治】【莫队】

    LINK 题目大意 给你一个序列分成k段 每一段的代价是满足\((a_i=a_j)\)的无序数对\((i,j)\)的个数 求最小的代价 思路 首先有一个暴力dp的思路是\(dp_{i,k}=min(d ...

  3. 洛谷P1912 [NOI2009]诗人小G(决策单调性)

    传送门 题解 决策单调性是个啥……导函数是个啥……这题解讲的是啥……我是个啥…… //minamoto #include<iostream> #include<cstdio> ...

  4. 【洛谷3515】[POI2011] Lightning Conductor(决策单调性)

    点此看题面 大致题意: 给你一个序列,对于每个\(i\)求最小的自然数\(p\)使得对于任意\(j\)满足\(a_j\le a_i+p-\sqrt{|i-j|}\). 证明单调性 考虑到\(\sqrt ...

  5. 【BZOJ2830/洛谷3830】随机树(动态规划)

    [BZOJ2830/洛谷3830]随机树(动态规划) 题面 洛谷 题解 先考虑第一问. 第一问的答案显然就是所有情况下所有点的深度的平均数. 考虑新加入的两个点,一定会删去某个叶子,然后新加入两个深度 ...

  6. 【洛谷p1601】A+B Problem(高精)

    高精度加法的思路还是很简单容易理解的 A+B Problem(高精)[传送门] 洛谷算法标签: 附上代码(最近懒得一批) #include<iostream> #include<cs ...

  7. 【洛谷4769】[NOI2018] 冒泡排序(动态规划_组合数学)

    题目: 洛谷 4769 博客页面左下角的嘴嘴瓜封神之战中的题目 分析: 一个排列交换次数为 \(\frac{1}{2}\sum_{i=1}^{n}|i-p_i|\) 的充要条件是这个排列不存在长度为 ...

  8. 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)

    洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...

  9. 洛谷P1973 [NOI2011]Noi嘉年华(动态规划,决策单调性)

    洛谷题目传送门 DP题怕是都要大大的脑洞...... 首先,时间那么大没用,直接离散化. 第一问还好.根据题意容易发现,当一堆活动的时间有大量重叠的时候,更好的办法是把它们全部安排到一边去.那么我们转 ...

随机推荐

  1. SSM项目layui分页实例

    最近学了layui,发现其中的分页挺有意思的,所以整理了一下,一遍自己随时查看.(官方文档上已经很详细了,当中有不足的地方欢迎大家指出) 关于前台的js文件,css样式,js样式,大家可以到官网下 本 ...

  2. sql server2016里面的json功能 - 转

    测试一下基本的,从查询结果里面构造一个json 的格式 create table t1(ID int identity,name nvarchar(50),Chinese int ,Math int) ...

  3. 【强化学习】python 实现 q-learning 例二

    本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10134855.html 问题情境 一个2*2的迷宫,一个入口,一个出口,还有一个陷阱.如图 ...

  4. SJP's Blog

    This is SJP's blog. Here is a mirror web of his blog.

  5. 校内模拟赛 虫洞(by NiroBC)

    题意: n个点m条边的有向图,每一天每条边存在的概率都是p,在最优策略下,询问从1到n的期望天数. 分析: dijkstra. 每次一定会优先选dp最小的后继走,如果这条边不存在,选次小的,以此类推. ...

  6. Linux系统安装IDS(snort工具)

    第一步:预装daq所需程序 snort使用数据采集器(daq)监听防火墙数据包队列,所以按照daq.需预装的程序有:flex.bison.libcap. sudo apt-get install fl ...

  7. A2dp连接流程源码分析

    在上一篇文章中,我们已经分析了:a2dp初始化流程 这篇文章主要分析a2dp的连接流程,其中还是涉及到一些底层的profile以及protocol,SDP.AVDTP以及L2CAP等. 当蓝牙设备与主 ...

  8. Bluedroid 函数分析:BTA_GATTC_Open

    进行GATT 通信,首先要打开GATT 的通道.下面我们分析BTA_GATTC_Open 这个函数: 这个函数在bta_gattc_api.c 文件中定义,这个是一个接口文件,里面没有做真正的open ...

  9. Linux系统特殊变量

    系统给定的特殊变量: 变量名 作用 $0 当前脚本的名字 $n 传递给脚本或者函数的参数,n表示第几个参数 $# 传递给脚本或函数的参数个数 $* 传递给脚本或函数的所有参数 $@ 传递给脚本或者函数 ...

  10. Rop框架学习笔记

    1.  提供了开发服务平台的解决方案:比如应用认证.会话管理.安全控制.错误模型.版本管理.超时限制 2.  启动:RopServlet截获http请求 配置: <servlet> < ...