Description
对于100%的数据,N ≤ 10000 , 数据保证询问的数列是一个有效的序列。
Analysis
dp显然
f[i][j]
表示做到第i个,前面填的数最大的为j的答案
f[i][j]=f[i−1][j]∗k+f[i−1][j−1]+g[i−1][j]∗(a[i]−1)
其中
g[i][max(1−i)]=1
O(n^2)
Code
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int N=10005,mo=1000007;
int n,a[N],f[N][N];
bool g[N][N];
int main()
{
scanf("%d",&n);
int mx=0;
fo(i,1,n)
{
scanf("%d",&a[i]);
mx=max(mx,a[i]);
g[i][mx]=1;
}
fo(i,2,n)
fo(j,1,i)
f[i][j]=((long long)f[i-1][j]*j%mo+f[i-1][j-1]+g[i-1][j]*min(j,a[i]-1))%mo;
int ans=1;
fo(i,1,n) ans=(ans+f[n][i])%mo;
printf("%d",ans);
return 0;
}