目录
- 1.数组切分
1.数组切分
1.问题描述
已知一个长度为 的数组: 恰好是 的一个排列。现在要求你将 数组切分成若干个 (最少一个, 最多
例如对于 , 一共有 5 种切分方法:
包含 到 , 是 一段连续的自然数, 另外 和
包含 到 , 是一段连续的自然数, 另外
包含 到 , 是 一段连续的自然数, 另外
: 只有一个子数组, 包含 到
2.输入格式
第一行包含一个整数 。第二行包含 个整数, 代表
3.输出格式
输出一个整数表示答案。由于答案可能很大, 所以输出其对 1000000007
取模后的值
4.样例输入
4
1 3 2 4
5.样例输出
5
6.数据范围
对于 评测用例, .
对于 评测用例, .
7.原题连接
数组切分
2.解题思路
一道比较明显的dp
题,首先考虑一段子数组在包含一段连续的自然数时,会有什么性质?设区间的值域为,不难发现如果该区间是一段连续自然数时,将会满足:
也就是区间的最大值减去最小值等于右端下标减去左端下标。有了这个性质以后,从数据范围考虑, 最多为 1e4
,说明我们可以进行一个 的 转移。
设 为只考虑前 个数能切分的情况数。当区间是一段连续自然数时,我们可以进行状态转移
对于每个 我们可以从倒着遍历回去一直到下标 ,同时开两个变量维护已遍历的数中的最大值和最小值,当此时区间是一段连续自然数时我们可以进行一次转移。
初始化时应该置 。
整体时间复杂度:
模板代码