U559662 不一般的操作

解析

对于操作次数只有 \(0\) 次的答案,直接判断 \(p\) 数组是否是 \(1\) 到 \(n\) 即可。

对于操作次数只有 \(1\) 次的答案,枚举断点 \(k\) ,此时的话,拆分为两个数组后,只需要判断两个数组是否都是给定的 \(p\) 数组的子序列。

对于 \(100 \%\) 的数据范围,思考整个过程是不是一直枚举断点即可,枚举 \(k\) 次???

比如给出一个数据

4 2
5 1
2 1 3 4

实际上,我们可以获悉,为了贡献值最小,可能按照其他方式先排其他位置

[1, 2, 3, 4] 变成 [2, 1, 3, 4]
可以设置断点就是k = 3
[1, 2, 3, 4]拆分为[1]和[2, 3, 4]
然后一次插入就可以搞定,1 放在 2 和 3 的中间
花费是3 * 5 = 15 还可以
第一次操作
[1, 2, 3, 4] 变成 [1, 3, 2, 4]
设置断点k = 2
[1, 2, 3, 4]拆分为[1, 2]和[ 3, 4]
合并为[1, 3, 2, 4]
第二次操作
[1, 3, 2, 4]变成[2, 1, 3, 4]
设置断点k = 2
[1, 3, 2, 4]拆分为[1, 3]和[2, 4]
合并为[2, 1, 3, 4]
花费是2 * 5 + 2 * 1 = 12

正向考虑会存在一个不确定性,即使可以获悉最终答案,但是时间仍然非常大。

遇到类似的题,关键要点在于正向考虑过于复杂,反向思考整个过程如何逆序??

比如正向考虑,划分一个断点,然后进行归并

反向考虑,选取一个子序列,放入到末尾,最终目标是让数组升序。

如果反向想变成 [1,2,3,4],则说明一定可以找到子序列[1,k]另外剩余的数字也是一个子序列,是[k + 1, 4]

关键点我们可以这样理解:

反向操作实际上就是从右侧序列之中找出两段数字连续上升的子序列,合并为一段数字连续上升,其他值保持不变

比如上图右侧的 \([1, 2, 3]\) 就是其中的数字连续上升的子序列, 其中的 \([4]\) 也是数字连续上升的子序列。

其实我们会发现一个最终问题,如果想把上述序列 \([1, 2, 3, 4]\) 排好序

可能是以下三种情况之一:

子序列 \([1, 2, 3,4]\) 和 子序列 \([]\) 反向合并,右侧找不到子序列 \([]\) ,所以此种合并失败,此时的断点就是 \(k = 0\) 。

子序列 \([1, 2, 3]\) 和 子序列 \([4]\) 反向合并,右侧这两个子序列都存在,合并成功,此时的断点就是 \(k = 1\) 。

子序列 \([1, 2]\) 和 子序列 \([3,4]\) 反向合并,很明显右侧找不出子序列 \([3, 4]\),所以此种合并失败,此时的断点就是 \(k = 2\) 。

子序列 \([1]\) 和 子序列 \([2,3,4]\) 反向合并,很明显右侧找不出子序列 \([2, 3, 4]\),所以此种合并失败,此时的断点就是 \(k = 3\) 。

子序列 \([]\) 和 子序列 \([1,2,3,4]\) 反向合并,很明显右侧找不到子序列 \([1,2,3,4]\) ,所以此种合并失败,此时的断点是 \(k = 4\) 。

所以现在反向问题转移到,是否右侧存在子序列 \([1, n - k]\) 以及子序列 \([n - k + 1, n]\) , 只要存在,就可以满足合法条件,继续往右侧的右侧继续询问,

对于子序列 \([1, n - k]\) ,又可以继续划分,看其右侧的右侧是否可以找到这样的两个子序列。

比如能找到子序列 \([1, 2]\) 和 子序列 \([3]\) ,肯定可以合并为子序列 \([1, 2, 3]\)

现在按照这组数据进行举例

4 2
5 1
2 1 3 4

① 确定状态
dp[x][l][r] 表示数值在[l, r]之内的数字,通过第x次到第t次操作内已经排好序的最小代价
② 确定答案
dp[1][1][n]
③ 确定状态转移方程
// 前面所有操作之中,结合划分为两个非空子段之后,尝试是否存在最小值
dp[x][i][j] = min(dp[x + 1][i][j], dp[x + 1][i][k] + dp[x + 1][k + 1][j] + (j - k) * c[x]);
④ 确定初始值和边界条件
dp[t + 1][i][i] = 0; // p[i]这个点排好序不需要满足任何条件
dp[t + 1][i][j] = 0
满足i到j是单调上升的

最终实现的时间复杂度 \(O(t \times n ^ 3)\) 。

最终可能需要注意到的是,本题可以理解为反向选取两个子序列然后拼接的方式

最坏情况下,最后答案之中一个上升的连续的子序列,比如[1], [1,2],[1,2,3,4]都不存在,

此时一定是 \([n, n - 1 \dots 1]\) 的输入。

另外只要 \(t\) 给的足够大,慢慢逆向也一定可以得到原来的递增数组。

U559662 不一般的操作-区间dp的更多相关文章

  1. 区间DP学习总结

    这段时间学习了区间DP,所以试着把学到的东西稍作总结,以备不时之需. 学习区间DP首先要弄清区间DP是为了解决什么问题:一般的DP主要是特征是一次往往只操作一个数值或者存储可以不连续的物品的状态(比如 ...

  2. 区间dp总结篇

    前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...

  3. HDU 5693 D Game 区间dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5693 题解: 一种朴实的想法是枚举选择可以删除的两个或三个数(其他的大于三的数都能凑成2和3的和), ...

  4. [HIHO1323]回文字符串(区间dp)

    题目链接:http://hihocoder.com/problemset/problem/1323 思路:区间dp,按照区间长度枚举所有区间和区间的起始位置.这时也可获取到区间的末位,比对这两个字符是 ...

  5. [NYIST737]石子合并(一)(区间dp)

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737 很经典的区间dp,发现没有写过题解.最近被hihocoder上几道比赛题难住了 ...

  6. hdu 5396 Expression(区间dp)

    Problem Description Teacher Mai has n numbers a1,a2,⋯,anand n−1 operators("+", "-&quo ...

  7. POJ1179Polygon(区间dp)

    啊~~ 被dp摁在地上摩擦的人 今天做了一道区间dp的题(POJ1179Polygon) 题目: Polygon Time Limit: 1000MS   Memory Limit: 10000K T ...

  8. codeforces#1132 F. Clear the String(神奇的区间dp)

    题意:给出一个字符串S,|S|<=500.每次操作可以删除一段连续的相同字母的子串.问,最少操作多少次可以把这个字符串变成空串. 分析:刚开始的思路是,把连续的串给删除掉,然后再....贪心.完 ...

  9. 区间dp(入门题)

    区间dp:顾名思义就是在区间上进行动态规划,通过合并小区间求解一段区间上的最优解. 常见模板: for(int len=1;len<n;len++){//区间长度 for(int be=1;be ...

  10. [CF1107E]Vasya and Binary String【区间DP】

    题目描述 Vasya has a string s of length n consisting only of digits 0 and 1. Also he has an array a of l ...

随机推荐

  1. C++/Python混合编程

    以 C++ 为底层基础,Python 作为上层建筑,共同搭建起高性能.易维护.可扩展的混合系统. Python 本身就有 C 接口,可以用 C 语言编写扩展模块,把一些低效耗时的功能改用 C 实现,有 ...

  2. 操作系统 -- Cache和内存

    程序局部原理性 CPU大多数时间在执行相同的指令或者与此相邻的指令,这就是程序局部性原理,依据此原理用来缓解CPU和内存之间的性能瓶颈. 内存 内存,从专业角度来讲,内存应该叫做DRAM,即动态随机存 ...

  3. RBMQ案例五:主题模式

    在之前的教程中,我们改进了日志系统.我们没有使用只能进行虚拟广播的扇出交换器,而是使用了直接交换器,并获得了选择性接收日志的可能性. 虽然使用直接交换改进了我们的系统,但它仍然有局限性--它不能基于多 ...

  4. LocalDateTime与时间戳、日期字符串的转换

    摘要:介绍LocalDateTime与时间戳.日期字符串的转换. 目录 需求背景 LocalDateTime转字符串 LocalDateTime转时间戳 时间戳转LocalDateTime 时间戳转日 ...

  5. Web前端入门第 61 问:JavaScript 各种对象定义与对象取值方法

    曾经有人说 JS 语言中万物皆对象,虽然这种说法不一定完全准确,但也有一定的道理.原因是 JS 的语法看起来所有的数据类型都像是一个对象,包括原始类型. const a = 1.234; consol ...

  6. linux下wget静默模式下载

    说明 在一些场景下,文件较大时,通过wget下载会展示时候进度,输出太多,这里我们如果想屏蔽输出可以采取静默模式 wget --quiet http://fileserver.test.com/cud ...

  7. equals与==与hashCode的区别与联系

    equals与hashcode的区别与联系 1."=="与equals的区别与联系 (1)"=="对于基本数据类型,只要值相等,就返回true,否则返回fals ...

  8. Tcode:PFAL说明

    Short text HR: ALE Distribution of HR Master Data Description. Scenario 1: Distribution of HR Master ...

  9. DTALK直播预约 | 数据资产管理:金融机构数据价值释放的必经之路

    当前,数据对金融机构业务和发展的重要性日益凸显,释放数据生产力已经成为金融机构进行全面数字化转型的核心,这就要求金融机构以数据资产为纲不断提升自身数据资产管理能力. 本期DTALK我们邀请到雅拓信息解 ...

  10. MySQL 04 深入浅出索引(上)

    索引的常见模型 实现索引的方式有很多种,这里先介绍三种常见结构:哈希表.有序数组和搜索树. 哈希表:只适用于只有等值查询的场景. 有序数组:在等值查询和范围查询场景中的性能都非常优秀,但是在更新数据的 ...