BZOJ1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
Posted ONION_CYC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ1584: [Usaco2009 Mar]Cleaning Up 打扫卫生相关的知识,希望对你有一定的参考价值。
【算法】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++。
以上是关于BZOJ1584: [Usaco2009 Mar]Cleaning Up 打扫卫生的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
BZOJ1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
BZOJ1584: [Usaco2009 Mar]Cleaning Up 打扫卫生