题目大意及模型转换
给定一个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]即为答案。