
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)}$
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月04日 22时31分33秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
看完这篇操作系统,和面试官扯皮就没问题了
2019-03-06
我的价值观
2019-03-06
一文详解 Java 并发模型
2019-03-06
值类型与引用类型(中)
2019-03-06
MSSQL 2005 数据库变成可疑状态
2019-03-06
QBlog V2.5 源码开放下载(ASP.NET 番外系列之开端)
2019-03-06
秋色园引发CPU百分百命案的事件分析与总结
2019-03-06
安装jdk并配置环境变量
2019-03-06
稀疏数组
2019-03-06
js的严格模式
2019-03-06
idea的安装和无限期试用
2019-03-06
Oracle VM VirtualBox安装PVE虚拟机
2019-03-06
【转】如何用css限制文字长度,使溢出的内容用省略号…显示
2019-03-06
Android MediaPlayer setDataSource failed
2019-03-06
ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
2019-03-06
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
2019-03-06
大前端的自动化工厂(1)——Yeoman
2019-03-06
数据仓库建模方法论
2019-03-06
虚拟机搭建hadoop环境
2019-03-06