题目描述
给出一个长度为n的序列A(A1,A2…AN)。如果序列A不是非降的,你必须从中删去一个数,
这一操作,直到A非降为止。求有多少种不同的操作方案,答案模10^9+7。
Sol
初看这题觉得很神仙啊 , 看到那个非降后立即停止就感觉不好做
所以我们要想着我们要知道些什么东西才能让问题变得好做起来
难点有2:
1.求出能够使得非降的操作序列个数
2.满足这些操作序列的合法性
对于第一个条件 我们可以发现 , 假设我们确定了要删什么元素能使得序列非降 , 那么就只用拿个阶乘计算操作的排列数就行了
所以我们考虑 dp 求解一个方案数,设 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示前 i 个元素选出了一个长度为 j 的非降序列 , 其他的都是要删掉的的方案数
发现要求非降 , 我们必须知道最后一个选的数是什么 , 因此可以把状态加个限制 第 i 位必须选
显然我们可以写出一个 O ( n 3 ) O(n^3) O(n3)的 dp , 不过这个东西 离散化后 用树状数组优化再明显不过可以做到 O ( n 2 l o g n ) O(n^2log n) O(n2logn) 了
然后考虑怎么计算答案 , 考虑一个操作序列不合第二个条件的原因
显然是本来序列就已经非降了但是你又删掉了一个元素 , 这样的话当我们用长度为 j 的序列计算答案的时候不合法的操作序列最后一定从长度为 j+1 的不降序列中删去了一个元素
那么就可以直接容斥求出和法方案
直接把方案数 减去 d p [ i ] [ j + 1 ] ∗ ( n − j − 1 ) ! ∗ ( j + 1 ) dp[i][j+1]*(n-j-1)!*(j+1) dp[i][j+