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

令 \(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. 【问题记录】—.NetCore 编译问题

    最近在协助验证Jenkins自动编译发布时,对一些.Net Core编译问题进行了解决:特记录一下 一.编译生成netcoreapp目录问题 问题现象 .net core项目编译输出目录总是包含在[n ...

  2. 枚举的使用(限foton)

    使用: /** * 服务真实性标签 * * @param realRepairs * 真实维修单数 * @param totalRepairs * 总单数 * @return */ public st ...

  3. 查询时间段内所有日期(限foton)

    String dataStr = "2019-04"; try { Date date = DateUtils.parseDate(dataStr); Date startTime ...

  4. android 下的 handler Message

    研究了下android下的 handler  message 实现原理: new handler() 的时候  从ThreadLocal里面 获取当前线程下的 Looper实例下的 MessageQu ...

  5. Tarjan缩点入门

    缩点 顾名思义,缩点就是把一个强连通分量缩成一个点 Tarjan 在dfs的过程中记录时间戳,若能够通过某个点返回已遍历的点,则可以缩点 inline void Tarjan(int x)// st栈 ...

  6. STM32入门系列-STM32外设地址映射

    片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设.相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外 ...

  7. 专题五:redis的数据类型之set

    一.基本简介 现在出现了新的查询需求:存储大量数据的同时,还需要在查询方面提供更高的效率.虽然list满足存储大量的数据,也可以通过索引来进行访问,但是list底层是双向链表的结构,在查询上的效率并没 ...

  8. ASP.NET Core Authentication系列(二)实现认证、登录和注销

    前言 在上一篇文章介绍ASP.NET Core Authentication的三个重要概念,分别是Claim, ClaimsIdentity, ClaimsPrincipal,以及claims-bas ...

  9. python机器学习识别手写数字

    手写数字识别 关注公众号"轻松学编程"了解更多. 导包 import numpy as np import matplotlib.pyplot as plt %matplotlib ...

  10. Oracle初始——第一天

    一.数据库分类 1.小型数据库:access.foxbase 2.中型数据库:informix.sql server.mysql 3.大型数据库:sybase.db2.oracle 二.注释 1./* ...