一句话题意:将一个数列分成若干段,每段的不和谐度为该段内不同数字数量的平方,求不和谐度之和的最小值。

令 \(f_i\) 表示前 \(i\) 个数的最小答案,很容易就能写出暴力转移方程:\(f_i=\min\{f_j+sum(j,i)\}(0\leq j<i)\)。\(sum(j,i)\) 表示 \(j\sim i\) 中不同数字的数量。

这样做是 \(n^2\) 的,考虑优化。发现 \(f\) 数组是单调不降的,在 \(sum(j,i)\) 相同时,\(j\) 取最小最优。继续推性质,发现答案最大是 \(n\)(每个数都分一段),所以 \(sum(j,i)\) 最大取 \(\lfloor\sqrt n\rfloor\) 否则显然不优。

然后就很简单了,我们对于 \(sum(j,i)\) 的每种取值都维护 \(j\) 的最小值即可。

所以做题要多推推性质啦。

时间复杂度 \(O(n\sqrt n)\)~

code:

#include<bits/stdc++.h>
using namespace std;
#define N 40005
#define Db double
#define Min(x,y)((x)<(y)?x:y)
#define For(i,x,y)for(i=x;i<=(y);i++)
int f[N],last[N],que[205];
int main()
{
int n,m,top,i,j,p;
scanf("%d%d",&n,&m);
top=int(sqrt(Db(n)));
For(i,1,m)last[i]=-1;
For(i,1,n)
{
f[i]=i;
scanf("%d",&p);
if(last[p]<que[1])
For(j,1,top)que[j-1]=que[j];
else
{
For(j,1,top)
if(que[j]==last[p])break;
while(j<top)que[j]=que[j+1],j++;
}
que[top]=i;
For(j,1,top)f[i]=Min(f[que[j-1]]+(top-j+1)*(top-j+1),f[i]);
last[p]=i;
}
cout<<f[n];
return 0;
}

P2943 [USACO09MAR]Cleaning Up G的更多相关文章

  1. [USACO09MAR]Cleaning Up

    题目大意: 给你一个长度为n的序列a,你可以将其分为若干段,最终的答案为每一段不同数个数的平方和. 思路: 不难想到一个O(n^2)的DP: f[i]=min{f[j]+cnt(j,i)^2} 考虑一 ...

  2. Storyboards Tutorial 03

    这一节主要介绍segues,static table view cells 和 Add Player screen 以及 a game picker screen. Introducing Segue ...

  3. 文件图标SVG

    ​<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink ...

  4. 洛谷2943 [USACO09MAR]清理Cleaning Up——转变枚举内容的dp

    题目:https://www.luogu.org/problemnew/show/P2943 一下想到n^2.然后不会了. 看过TJ之后似乎有了新的认识. n^2的冗余部分在于当后面那部分的种类数一样 ...

  5. luogu 2943 [USACO09MAR]清理Cleaning Up 动态规划

    非常巧妙的动态规划. 你会发现每一个区间地颜色种类不能超过 $\sqrt n$, 所以可以直接枚举区间颜色种类. 令这个为 $pos[j],$ 然后考虑如何去更新这个东西就行了. Code: #inc ...

  6. 3389: [Usaco2004 Dec]Cleaning Shifts安排值班

    3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 102  Solved: ...

  7. data cleaning

    Cleaning data in Python   Table of Contents Set up environments Data analysis packages in Python Cle ...

  8. POJ 2376:Cleaning Shifts(贪心)

    题目大意:有n个奶牛,他们负责在长为t个时间点的时间内值班,每个时间点至少有一个在值班,每个奶牛有一段空闲时间可以值班,求满足要求所需最少奶牛数量,无法满足则输出-1. 分析: 将奶牛空闲时间段看成线 ...

  9. 学习笔记(四): Representation:Feature Engineering/Qualities of Good Features/Cleaning Data/Feature Sets

    目录 Representation Feature Engineering Mapping Raw Data to Features Mapping numeric values Mapping ca ...

随机推荐

  1. Java:基于TCP协议网络socket编程(实现C/S通信)

    目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...

  2. SpringBoot第二集:注解与配置(2020最新最易懂)

    2020最新SpringBoot第二集:基础注解/基础配置(2020最新最易懂) 一.Eclipse安装SpringBoot插件 Eclipse实现SpringBoot开发,为便于项目的快速构建,需要 ...

  3. Sublime Text:性感无比的代码编辑器安装破解配置教程

    代码编辑器或者文本编辑器,对于程序员来说,就像剑与战士一样,谁都想拥有一把可以随心驾驭且锋利无比的宝剑,而每一位程序员,同样会去追求最适合自己的强大.灵活的编辑器,相信你和我一样,都不会例外. 我用过 ...

  4. JAVA概述-JAVA入门基础

    一.JAVA的历史 Java是1995年由Sun公司(现Oracle公司)推出的一门面向对象的高级编程语言.这门编程语言的Logo就像是一杯刚刚煮好的咖啡. Java最初期的开发是在1991年,最初的 ...

  5. 一个Task.Factory.StartNew的错误用法

    同事写了这样一段代码: FactoryStartNew类: using System; using System.Collections.Generic; using System.Linq; usi ...

  6. NB-IoT窄带物联网技术的四大优势

      NB-IoT是指窄带物联网(Narrow Band -Internet of Things)技术,是IoT领域一个新兴的技术,支持低功耗设备在广域网的蜂窝数据连接,也被叫作低功耗广域网(LPWA) ...

  7. 【译】Ringbahn的两个内存Bug

    原文链接:https://without.boats/blog/two-memory-bugs-from-ringbahn/ 原文标题:Two Memory Bugs From Ringbahn 公众 ...

  8. PHP获取文件拓展名的方法

    1.用strrchar()函数,查找字符串在另一字符串中最后出现的位置,并返回该位置到字符串最后的所有字符(返回结果包括点).即返回拓展名前  点  到结尾的字符,即为扩展名.注意与strchar() ...

  9. .NetCore简单封装基于IHttpClientFactory的HttpClient请求

    IHttpClientFactory是什么?为什么出现了IHttpClientFactory 一.IHttpClientFactory是什么? IHttpClientFactory是.netcore2 ...

  10. 分布式文档存储数据库之MongoDB基础入门

    一.MongoDB简介 MongoDB是用c++语言开发的一款易扩展,易伸缩,高性能,开源的,schema free 的基于文档的nosql数据库:所谓nosql是指不仅仅是sql的意思,它拥有部分s ...