囚人的旋律

题目大意及模型转换

给定一个N的排列,第i个数为a[i]。选择一些数组成集合,需要满足以下条件。
1、对于集合内 i<j a[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]即为答案。

你可能感兴趣的:(囚人的旋律)