首先(看题解)可得。。。分成的任意一段中的不同颜色个数都<=根号n。。。不然的话直接分成n段会更优= =

  然后就好做多了。。

  先预处理出对于每头牛i,和它颜色相同的前一头和后一头牛的位置。

  假设当前枚举到第i头牛,pos[j]表示 第pos[j]头~第i头牛之间颜色种数<=j。num[j]表示第pos[j]头~第i头牛之间具体的颜色种数。

  每次i增大时,就要把pos数组和num数组更新。对于新加进来的牛i,如果和它颜色相同的前一头牛不在pos[j]~i的范围中,那么就要把num[j]+1。

  但根据定义,num[j]<=j,所以如果num[j]>j的话就要把pos[j]往i的方向挪。。。如果与第pos[j]头牛颜色相同的后一头牛不在pos[j]~i的范围中,删去第pos[j]头牛后区间里的颜色数量就会-1。。。。

  DP,设f[i]表示将1~i头牛分成若干段的最小不和谐度。。f[i]=min{f[pos[j]-1]+num[j]^2},(1<=j<=n^0.5)。。。

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define us unsigned short
using namespace std;
const int maxn=;
us pre[maxn],next[maxn],precol[maxn],nextcol[maxn];
us a[maxn],b[],c[],f[maxn];//b[j]: b[j]~i中不同数字个数<=j c[j]表示b[j]+1到i出现的不同数字的个数
us i,j,n,m;
us ra;char rx;
inline us read(){
rx=getchar();ra=;
while(rx<''||rx>'')rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra;
}
int main(){
n=read();m=read();
for(i=;i<=m;i++)nextcol[i]=n+;m=floor(sqrt(n));
for(i=;i<=n;i++)
a[i]=read(),pre[i]=precol[a[i]],precol[a[i]]=i;
for(i=n;i;i--)
next[i]=nextcol[a[i]],nextcol[a[i]]=i;
for(i=;i<=m;i++)b[i]=;
for(i=;i<=n;i++)
for(j=;j<=m;j++){
if(pre[i]<b[j]){
c[j]++;
if(c[j]>j){while(next[b[j]]<=i)b[j]++;b[j]++;c[j]--;}
}
if(f[b[j]-]+c[j]*c[j]<f[i]||!f[i])f[i]=f[b[j]-]+c[j]*c[j];
}
printf("%d\n",f[n]);
return ;
}

[bzoj1587] [Usaco2009 Mar]Cleaning Up 打扫卫生的更多相关文章

  1. DP经典 BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生

    BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 419  Solve ...

  2. BZOJ_1584_[Usaco2009 Mar]Cleaning Up 打扫卫生_DP

    BZOJ_1584_[Usaco2009 Mar]Cleaning Up 打扫卫生_DP Description 有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= ...

  3. BZOJ1584 [Usaco2009 Mar]Cleaning Up 打扫卫生

    令$f[i]$表示以i为结尾的答案最小值,则$f[i] = min \{f[j] + cnt[j + 1][i]^2\}_{1 \leq j < i}$,其中$cnt[j + 1][i]$表示$ ...

  4. bzoj:1584: [Usaco2009 Mar]Cleaning Up 打扫卫生

    Description 有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分成若干段,定义每段的 ...

  5. 【BZOJ】1584: [Usaco2009 Mar]Cleaning Up 打扫卫生

    [算法]DP+数学优化 [题意]把n个1~m的数字分成k段,每段的价值为段内不同数字个数的平方,求最小总价值.n,m,ai<=40000 [题解] 参考自:WerKeyTom_FTD 令f[i] ...

  6. 【动态规划】bzoj1584: [Usaco2009 Mar]Cleaning Up 打扫卫生

    思路自然的巧妙dp Description 有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分 ...

  7. [BZOJ1584] [Usaco2009 Mar]Cleaning Up 打扫卫生(DP)

    传送门 不会啊,看了好久的题解才看懂 TT 因为可以直接分成n段,所以就得到一个答案n,求解最小的答案,肯定是 <= n 的, 所以每一段中的不同数的个数都必须 <= sqrt(n),不然 ...

  8. bzoj1584 [Usaco2009 Mar]Cleaning Up 打扫卫生 动态规划+思维

    Description 有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分成若干段,定义每段的 ...

  9. bzoj 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生【dp】

    参考:http://hzwer.com/3917.html 好神啊 注意到如果分成n段,那么答案为n,所以每一段最大值为\( \sqrt{n} \) 先把相邻并且值相等的弃掉 设f[i]为到i的最小答 ...

随机推荐

  1. ubuntu设置静态ip

    设置固定ip地址 >>>>>>>>>> ifconfig -a,  (注:p1p1为网卡名称) 配置静态ip vim /etc/networ ...

  2. 控制input 输入框的placeholder

    /*webkit placeholder居右*/ ::-webkit-input-placeholder { color: #e7e7e7; text-indent: .3rem; font-size ...

  3. Apache Avro# 1.8.2 Specification (Avro 1.8.2规范)二

    h5 { text-indent: 0.71cm; margin-top: 0.49cm; margin-bottom: 0.51cm; direction: ltr; color: #000000; ...

  4. Jmeter 创建FTP测试计划

    FTP服务主要提供上传和下载功能. 操作步骤: 1.创建一个线程组 2.线程组--->添加--->配置元件--->FTP请求缺省值:输入服务器名称或IP. 3.线程组--->添 ...

  5. 总结oninput、onchange与onpropertychange事件的用法和区别

    前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框hu9i动态显示还可以输入的字数.过去一般都使用onchange/onkeyup/onkeypress/onke ...

  6. Tablayout ViewPage 使用示例

    上一篇文章介绍了使用 FragmenttabHost 来使用 tab 导航:到 Android 5.0 的时候,又推出了 TabLayout.因此,有必要对tablayout 进行了解下. 首先我们来 ...

  7. DBA 优化法则

    硬件资源是根本,DBA是为了充分利用硬件资源:(更新中--) 统一SQL语句: 减少SQL嵌套: 执行计划返回结果集(决定计划走向): 合理使用临时表: tempdb分多文件: OLTP 条件使用变量 ...

  8. pagelatch等待在tempdb的gsm页面上

    Each data file has a gam page, sql will update it when allocate space in the file. Will see contenti ...

  9. python字符集的转换(mysql数据乱码的处理)

    本文参考:http://blog.csdn.net/crazyhacking/article/details/39375535 chardet模块:http://blog.csdn.net/tianz ...

  10. Python的locals()函数

    Python的locals()函数会以dict类型返回当前位置的全部局部变量. 示例代码: def func(): arg_a, arg_b = 'a', 'b' def func_a(): pass ...