题目描述
PIPI老师的Java编程课有N名同学参加了期末考试,现在他们在PIPI老师办公室门外排成一排,领取奖励。
PIPI老师决定奖励他们每人若干颗爪哇咖啡豆。具体规则如下:
每人奖励至少一颗,最多K颗咖啡豆。
对于前后相邻的2名同学,如果他们期末分数一样,那么他们得到的咖啡豆数量也要一样;否则分数高的同学得到较多的咖啡豆。
现在按他们排队的顺序给定每名同学的期末考试分数,请你计算PIPI老师有多少种不同的奖励方法满足以上规则。由于方案数可能非常多,你只需要输出模1000000007的结果即可。
输入
多组数据
第一行包含两个N和K。
第二行包含N个整数A1, A2, ... AN。
1 <= N <= 100000
1 <= K <= 100
0 <= Ai <= 100
输出
输出一个整数,代表一共有多少不同方案,对1000000007取模
样例输入
3 3 88 100 90
样例输出
5
- dp[i][j]表示第i个数放j的方案数
- 初值dp[0][i] = 1
- 当a[i] > a[j]时,dp[i][j] = dp[i][j-1] + dp[i-1][j-1]; dp[i][1] = 0;
- 当a[i] < a[j]时,dp[i][j] = dp[i][j+1] + dp[i-1][j+1]; dp[i][k] = 0;
- 记录时不需要存重复的数
int dp[2][k];
for (int i = 1; i <= k; i++) {
dp[0][i] = 1;
}
for (int i = 1; i <= cnt; i++) {
if (a[i] > a[i-1]) {
dp[i%2][1] = 0;
for (int j = 2; j <= k; j++) {
dp[i%2][j] = dp[i%2][j-1] + dp[(i-1)%2][j-1];
dp[i%2][j] %= M;
}
} else if (a[i] < a[i-1]) {
dp[i%2][k] = 0;
for (int j = k - 1; j >= 1; j--) {
dp[i%2][j] = dp[i%2][j+1] + dp[(i-1)%2][j+1];
dp[i%2][j] %= M;
}
}
}
int ans = 0;
for (int i = 1; i <= k; i++) {
ans += dp[cnt%2][i];
ans %= M;
}
cout << ans << endl;