洛谷题目传送门

貌似做所有的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. 转:判断js中的数据类型的几种方法

    判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...

  2. css实现按钮固定在底部

    实现类似如下图的功能: 采用如下的样式来控制:

  3. Android开发——ListView使用技巧总结(二)

    0.  前言 Android中的ListView是用的比较多的控件之一,在上一篇Android开发--ListView使用技巧总结(一)中对ListView的ViewHolder机制.优化卡顿方式以及 ...

  4. Luogu P2657 [SCOI2009]windy数

    一道比较基础的数位DP,还是挺套路的. 首先看题,发现这个性质和数的大小无关,因此我们可以直接数位DP,经典起手式: \(f[a,b]=f(b)-f(a-1)\) 然后考虑如何求解\(f(x)\).我 ...

  5. 大数据处理过程核心技术ETL详细介绍

    架构挑战 1.对现有数据库管理技术的挑战. 2.经典数据库技术并没有考虑数据的多类别(variety).SQL(结构化数据查询语言),在设计的一开始是没有考虑到非结构化数据的存储问题. 3.实时性技术 ...

  6. NTP服务部署和测试

    1. 概述2. 部署3. 配置4. 客户端配置4.1 客户端安装ntpdate4.2 同步设置 1. 概述 本篇博客主要记录如何部署一台NTP服务器,用于内网时间同步. 时间服务器对于集群内部节点之间 ...

  7. RetrieveFavicon 获取任何站点的 favicon

    原文发表于我的技术博客 开源了一个获取任何站点 favicon 的类库,供使用. 原文发表于我的技术博客 RetrieveFavicon Project GitHub Retrieve favicon ...

  8. 详解centos7配置本地yum源的方法

    近在使用虚拟机时遇到一些麻烦,因为公司内部有网络管理,所以vm连接不上外网,yum无法安装软件,怎么解决呢?–使用iso做本地yum源,可以解决大部份的包安装. vm安装的是centos7. 1.挂载 ...

  9. python基础学习笔记(十)

    魔法方法.属性 ------------------------ 准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Objec ...

  10. 【Beta阶段】第八次Scrum Meeting!

    每日任务内容: 本次会议为第八次Scrum Meeting会议~ 由于本次会议项目经理身体不适,未参与会议,会议精神由卤蛋代为转达,其他同学一起参与了会议 队员 昨日完成任务 明日要完成任务 刘乾 今 ...