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. PyYaml简单学习

    YAML是一种轻型的配置文件的语言,远比JSON格式方便,方便人类读写,它通过缩进来表示结构,很具有Python风格. 安装:pip insall pyyaml YAML语法 文档 YAML数据流是0 ...

  2. 5 MyBatis动态sql中foreach标签的使用

    1 MyBatis动态SQL之if 语句 2 MyBatis动态sql之where标签|转 3 MyBatis动态SQL之set标签|转 4 MyBatis动态SQL之trim元素|转 5 MyBat ...

  3. ubuntu2204 ROS2安装

    ubuntu初始环境配置ROS2 换源 备份原来的文件 sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 换源 sudo gedit / ...

  4. FlashAttention安装失败的一种可能的原因,nvcc -V与nvidia-smi显示的CUDA版本号不一样

    $ pip install flash-attn --no-build-isolation 报错 RuntimeError: FlashAttention is only supported on C ...

  5. C#:wpf ui 4.0 是如何实现页面导航的?

    wpf ui 介绍 wpf ui 是一款我比较喜欢的wpf ui界面开源库,目前已经获得了8.5颗stars,还是很受欢迎的: wpf ui在vs中也提供了快速开发模板: 让wpf开发者可以快速进行应 ...

  6. vue脚手架搭建,出现无法将“vue”项识别....

    前言: 肯定有很多小伙伴和我一样,想在各种开发工具的终端运行命令来新建vue-cli脚手架,可是vue命令就是识别不到,然后又很烦,不妨看看我这个解决方案吧!!! 遇见问题: vue : 无法将&qu ...

  7. MindManager:将excel转成思维导图

    当被要求把一个excel的内容转成思维导图的时,我讨要了很长的时间,使得有更多时间进行摸鱼,来完成本篇博客. 一:excel格式 绝不能使用合并单元格的方式,有合并的地方需要拆分,这是因为合并单元格后 ...

  8. 解决Chrome打印对话框中没有布局设置横向问题

    本文方法来源于stackoverflow: https://stackoverflow.com/questions/36322109/chrome-printing-website-missing-l ...

  9. 提取并下载谷歌应用商店软件(Google Play APK download)教程

    参考:https://www.bilibili.com/read/cv12761045 接进到下面任意一个网站中,搜索想要下载的应用即可. (0) https://google-play.en.upt ...

  10. 自用的springboot后端增删改查模板

    Springboot后端简易方式快速搭建 前言 快速学了下.和传统的springboot项目相比,没有用service和serviceImpl.比较不合规,但够简单.可以用于快速开发. 前后端分离.前 ...