#include<iostream>
using namespace std;
const int N=1111,mod=19650827;
int f[N][N][2],a[N];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++) f[i][i][0]=1;
for(int len=2;len<=n;len++)
{
for(int l=1;l<=n-len+1;l++)
{
int r=l+len-1;
// l从左边进去
if(a[l]<a[l+1]) f[l][r][0]+=f[l+1][r][0];
if(a[l]<a[r]) f[l][r][0]+=f[l+1][r][1];
// r从右边进去
if(a[r]>a[r-1]) f[l][r][1]+=f[l][r-1][1];
if(a[r]>a[l]) f[l][r][1]+=f[l][r-1][0];
f[l][r][1]%=mod;
f[l][r][0]%=mod;
}
}
cout<<(f[1][n][1]+f[1][n][0])%mod<<endl;
return 0;
}
该回答引用ChatGPT
这道题目可以用动态规划的思想来解决,假设 $f[i][j]$ 表示以 $i$ 为结尾,长度为 $j$ 的上升子序列的方案数。则状态转移方程为:
$$
f[i][j] = \sum_{k=1}^{i-1}f[k][j-1] \times \sum_{p=i+1}^{n}f[p][j-1] \quad (height_k < height_i, height_p > height_i)
$$
其中,$height_i$ 表示第 $i$ 个人的身高。最终答案为 $\sum_{i=k}^{n}f[i][k]$。