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 }