bzoj1831: [AHOI2008]逆序对
发布日期:2021-05-06 23:45:59 浏览次数:22 分类:精选文章

本文共 607 字,大约阅读时间需要 2 分钟。

这道题最初看起来有点难,但通过仔细思考,我们可以一步步理清思路。题目要求我们在一个序列中填补那些为-1的位置,使得整个序列的逆序对数最少。逆序对是指序列中两个元素的位置i和j,i<j但a[i]>a[j]的数量。我们的目标是找到最优的填法来最小化逆序对的数量。

一开始,我以为这个题目可能需要动态规划(DP)来解决,因为每个位置的选择会影响后面所有位置的选择。经过进一步的思考,我发现如果能保证整个序列是递增的,那么逆序对的数量就会最少,因为这样不会有任何逆序对。

为了构造这样的递增序列,我们可以使用动态规划的方法。假设我们有一个数组dp,其中dp[i][j]表示前i个位置,第i位填了j的最小代价。这里的代价可能是指逆序对的增加数量。每次填一个数时,我们需要根据前面已填的数来更新当前的选择。

在实现细节方面,代码中有一个cost函数,用于计算在某个位置填入某个数所增加的逆序对数。这可以通过前面的数值和当前数值的比较来计算。同时,g和gg数组用于记录某个位置前面有多少数比它小或大,这有助于计算逆序对的数量。

通过推导,我发现确实可以用动态规划的方法来解决这个问题。每个位置只能填比前面所有位置都大的数,这样就能保证整个序列是递增的,从而逆序对数最少。

最终,我总结出,这个问题的最优解就是构造一个递增序列,并通过动态规划来记录每个位置的最优选择,从而得到最小的逆序对数。

答案:$\boxed{O(nk)}$

上一篇:bzoj 1823: [JSOI2010]满汉全席
下一篇:bzoj 3208: 花神的秒题计划Ⅰ

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月04日 22时31分33秒