bzoj1996 [Hnoi2010]chorus 合唱队_模拟设计

这道题就是普通的dp表示i到j的范围内最后是从左加入还是从右加入,然后判断条件是否符合就可以了。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 const int mod=19650827,NN=1007;
 9 
10 int n,i,j;
11 int a[NN],f[NN][NN][2]={0};
12 
13 int main()
14 {
15     scanf("%d",&n);
16     for (int i=1;i<=n;i++)
17         scanf("%d",&a[i]);
18     for (int i=1;i<=n;i++)
19         f[i][i][0]=1;
20     for(int i=n;i>=1;i--)
21         for(int j=i+1;j<=n;j++)
22         {
23                if(a[j]>a[i]) f[i][j][1]+=f[i][j-1][0];
24             if(a[j]>a[j-1]) f[i][j][1]+=f[i][j-1][1];
25             if(a[i]<a[i+1]) f[i][j][0]+=f[i+1][j][0];
26             if(a[i]<a[j]) f[i][j][0]+=f[i+1][j][1];
27             f[i][j][0]%=mod;
28             f[i][j][1]%=mod;
29         }
30     int ans=(f[1][n][0]+f[1][n][1])%mod;
31     printf("%d",ans);
32 }