码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-09-22 20:09:27      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:价值   get   元素   art   开始   csdn   tom   定义   最优   

【算法】DP+数学优化

【题意】把n个1~m的数字分成k段,每段的价值为段内不同数字个数的平方,求最小总价值。n,m,ai<=40000

【题解】

参考自:WerKeyTom_FTD

令f[i]表示把前i个数分成若干段的最小价值。

转移中我们定义,从i开始往前到有j个不同的数的最小位置为b[j]。

f[i]=f[b[j]-1]+j^2。

考虑最坏情况,每个数自成一段,则总价值为n。

所以当段内不同的数个数>√n时,就不可能是最优解了(此时价值>n)。

所以f[i]=f[b[j]-1]+j^2,1<=j<=√n。

快速计算的关键在递推b[j]数组,首先在递推过程中同步计算上一个等数位置last[]和桶c[]。

枚举j:

如果last[i]>=b[j],不会新增数,不改变。

否则,b[j]++直到c[a[b[j]]]=a[b[j]],此时b[j]++得到新的b[j]。

注意若元素个数不满√n个,出现新元素就top++。

 

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

标签:价值   get   元素   art   开始   csdn   tom   定义   最优   

原文地址:http://www.cnblogs.com/onioncyc/p/7576872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!