【洛谷】題解 P3205 【[HNOI2010]合唱隊】
阿新 • • 發佈:2019-01-05
注意答案對19650827取模。。。
經典的區間DP狀態和轉移方程
F[l][r]表示當前最後一個新增的人是l的方案數
G[l][r]表示當前最後一個新增的人是r的方案數
f[l][r]=f[l+1][r] (a[l]<a[l+1]) +g[l+1][r] (a[l]<a[r])
g[l][r]=f[l][r-1] (a[l]<a[r]) +g[l][r-1] (a[r-1]<a[r])
// luogu-judger-enable-o2
//#define LOCAL
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <bits/stdc++.h>
#define INF 0x3f
#define ull unsigned long long
#define ll long long
#define FOR(a, b, n) for(int a = b; b >= n ? a >= n : a <= n; b >= n ? a-- : a++)
#define M(a, n) memset(a, n, sizeof(a));
#define S(n) scanf("%d", &n)
#define P(n) printf("%d", n)
#define G(n) getline(cin, n)
#define PI acos(-1.0)
using namespace std;
const int NR = 1006;
inline int read() {
int s = 0, w = 1;
char ch = getchar();
while(ch <= '0' || ch > '9') {
if(ch == '-') {
w = -1;
ch = getchar();
}
}
while(ch >= '0' && ch <= '9') {
s = s * 10 + ch - '0';
ch = getchar();
}
return s * w;
}
const int mod = 19650827;
ll a[NR], f[NR][NR], g[NR][NR], l, r, n;
inline ll mx(ll x, ll y) {
return x < y ? 1 : 0;
}
int main() {
S(n);
FOR(i, 1, n)
S(a[i]);
FOR(i, 1, n)
f[i][i] = 1;
FOR(i, 1, n - 1)
FOR(j, 1, n) {
if(i + j > n)
continue;
int l = j, r = j + i;
f[l][r] = (f[l + 1][r] * mx(a[l], a[l + 1]) + g[l + 1][r] * mx(a[l], a[r])) % mod;
g[l][r] = (f[l][r - 1] * mx(a[l], a[r]) + g[l][r - 1] * mx(a[r - 1], a[r])) % mod;
}
P((f[1][n] + g[1][n]) % mod);
return 0;
}