【BZOJ 4361】isn(dp计数+容斥)

题目链接

题目描述

给出一个长度为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+

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值