动态规划

区间DP。

思维:dp[i][j][0/1]代表i到j遇见最后一个人是从 左边/右边上车的。则状态转移方程如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

using namespace std;
int n;
int dp[1005][1005][2];
int num[1005];
const int p = 19650827;
int ()
{
cin >> n;
for (int i = 1; i <= n;i++)
{
cin >> num[i];
}
for (int i = 1; i <= n;i++)
{
dp[i][i][0] = 1;
}
for (int l = 1; l <= n; l++)
{
for (int i = 1, j; (j=i+l) <= n; i++)
{
dp[i][j][0] = (dp[i + 1][j][1] * (num[j] > num[i]) + dp[i + 1][j][0] * (num[i + 1] > num[i])) % p;
dp[i][j][1] = (dp[i][j - 1][1] * (num[j] > num[j - 1]) + dp[i][j-1][0] * (num[j] > num[i])) % p;
}
}
cout << (dp[1][n][0] + dp[1][n][1]) % p << endl;
}