Description
![](https://www.lydsy.com/JudgeOnline/images/1996_1.jpg)
Input
![](https://www.lydsy.com/JudgeOnline/images/1996_2.jpg)
Output
![](https://www.lydsy.com/JudgeOnline/images/1996_3.jpg)
Sample Input
4
1701 1702 1703 1704
1701 1702 1703 1704
Sample Output
8
HINT
区间$dp$,首先每个点被放入队伍时队伍中所有人构成的序列中连续的一段
那么这个人在放入时一定是由最左边或最右边的人转移过来的,即由一段向外扩展转移
这就是一个基础的区间$dp$模型,注意细节即可
代码:
1 #include<iostream> 2 #include<cstdio> 3 #define mod 19650827 4 using namespace std; 5 int n;int a[1001],f[1001][1001][2]; 6 int main() 7 { 8 cin>>n; 9 for(int i=1;i<=n;i++) cin>>a[i]; 10 for(int i=1;i<n;i++) 11 if(a[i]<a[i+1]) 12 f[i][i+1][0]=f[i][i+1][1]=1; 13 for(int len=1;len<n;len++) 14 for(int l=1;l+len<=n;l++) 15 { 16 int r=l+len; 17 if(a[l]<a[l+1]) f[l][r][0]=(f[l][r][0]+f[l+1][r][0])%mod; 18 if(a[l]<a[r]) f[l][r][0]=(f[l][r][0]+f[l+1][r][1])%mod; 19 if(a[r]>a[r-1]) f[l][r][1]=(f[l][r][1]+f[l][r-1][1])%mod; 20 if(a[r]>a[l]) f[l][r][1]=(f[l][r][1]+f[l][r-1][0])%mod; 21 } 22 cout<<(f[1][n][0]+f[1][n][1])%mod<<endl; 23 return 0; 24 }