bzoj 1996
区间 dp
$f[i][j][1/0]$ 表示将理想数列的 $[i,j]$ 区间排好的方案数
$f[i][j][1]$ 表示最后进去的是第 $i$ 个人
$f[i][j][0]$ 表示最后进去的是第 $j$ 个人
根据判断条件进行转移
#include <bits/stdc++.h> const int N = 1010, Mod = 19650827; int f[N][N][2]; int A[N]; int main() { int n; std:: cin >> n; for(int i = 1; i <= n; i ++) std:: cin >> A[i]; for(int i = 1; i <= n; i ++) f[i][i][1] = 1; //f[i][i][0] = 1; for(int Len = 2; Len <= n; Len ++) { for(int i = 1; i <= n; i ++) { int j = i + Len - 1; if(j > n) continue; if(A[i] < A[i + 1]) f[i][j][1] = (f[i][j][1] + f[i + 1][j][1]) % Mod; if(A[i] < A[j]) f[i][j][1] = (f[i][j][1] + f[i + 1][j][0]) % Mod; if(A[j] > A[j - 1]) f[i][j][0] = (f[i][j][0] + f[i][j - 1][0]) % Mod; if(A[j] > A[i]) f[i][j][0] = (f[i][j][0] + f[i][j - 1][1]) % Mod; } } std:: cout << (f[1][n][1] + f[1][n][0]) % Mod; return 0; }