0
点赞
收藏
分享

微信扫一扫

P3205 [HNOI2010]合唱队


1,新入队人员可能被排在左边或者排在右边

2,排在左边或右边 取决于上一个入队人的身高(上一个入队人 或在左边(dp[i][j][0])或在右边(dp[i][j][1]))

初始化数据:dp[i][i][0]+dp[i][j][1]=1 一个人的队列只有一种情况

动态转移方程:

if (hight[i] < hight[i + 1])dp[i][j][0] += dp[i + 1][j][0];
if (hight[i] < hight[j])dp[i][j][0] += dp[i + 1][j][1];
if (hight[j] > hight[i])dp[i][j][1] += dp[i][j - 1][0];
if (hight[j] > hight[j-1])dp[i][j][1] += dp[i][j - 1][1];

#include<iostream>
using namespace std;
#define N 1005
int dp[N][N][2];
int hight[1005];
int n;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> hight[i];
}
for (int i = 0; i <= n; i++) {
dp[i][i][0] = 1;
}
for (int k = 1; k <=n; k++) {
for (int i = 1,j=i+k; i<=n,j<=n; i++,j++) {
if (hight[i] < hight[i + 1])dp[i][j][0] += dp[i + 1][j][0];
if (hight[i] < hight[j])dp[i][j][0] += dp[i + 1][j][1];
if (hight[j] > hight[i])dp[i][j][1] += dp[i][j - 1][0];
if (hight[j] > hight[j-1])dp[i][j][1] += dp[i][j - 1][1];
dp[i][j][0] %= 19650827;
dp[i][j][1] %= 19650827;
}
}
cout << (dp[1][n][0] + dp[1][n][1])%19650827 << endl;
return 0;
}


举报

相关推荐

0 条评论