
区间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; }
|
近期评论