囚人的旋律

题目大意及模型转换

给定一个N的排列,第i个数为a[i]。选择一些数组成集合,需要满足以下条件。
1、对于集合内i<ja[i]<a[j]
2、对于集合内i<j,集合外i<k<j,满足a[i]>a[k]或a[k]>a[j]
求满足条件的集合个数,两个集合包含相同元素视为相同。N<=1000。答案模P=1000000007。

简单DP

设f[i]表示前i个选一些数进入集合且第i个必须进入集合。转移显然。
确定一个i,并枚举一个j,判定i,j是否能同时选入集合。

优化

我们需要优化第二个条件合法判定的时间。确定一个i,然后每次将j加一。a[i]固定了,每次j右移一位会加入一个新的j-1。如果a[i]>a[k],那么一定合法。我们只需要讨论不满足a[i]>a[k]的情况,如何判定a[k]>a[j]。我们发现如果要满足a[k]>a[j],所有a[k]最小值一定大于a[j],而如果最小值都大于a[j],即可以判合法。维护最小值即可。

注意

为了统计方便,a[0]=-inf,a[n+1]=inf。那么f[n+1]即为答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值