luogu P3205 [HNOI2010]合唱队
题面传送门
一道蛮好的区间\(dp\)。
设\(f_{i,j,0}\)表示最后一个人从左边进来的方案数,\(f_{i,j1}\)表示从右边进来的方案数,分类讨论一下就好了。
代码实现:
#include<cstdio>
#define mod 19650827
using namespace std;
int n,m,k,a[1039],f[1039][1039][2],ans,tot,pus;
int main(){
register int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&a[i]),f[i][i][1]=1;
for(i=n;i>=1;i--){
for(j=i+1;j<=n;j++){
if(a[i]<a[i+1])f[i][j][0]+=f[i+1][j][0];
if(a[i]<a[j])f[i][j][0]=(f[i+1][j][1]+f[i][j][0])%mod;
if(a[j]>a[i])f[i][j][1]=f[i][j-1][0];
if(a[j]>a[j-1])f[i][j][1]=(f[i][j-1][1]+f[i][j][1])%mod;
}
}
printf("%d\n",(f[1][n][1]+f[1][n][0])%mod);
}

浙公网安备 33010602011771号