题意:
蚂蚁牙黑,蚂蚁牙红:有A只蚂蚁,来自T个家族。同一个家族的蚂蚁长得一样,但是不同家族的蚂蚁牙齿颜色不同。任取n只蚂蚁(S<=n<=B),求能组成几种集合?
思路:
1、《挑战》P69 前缀和优化;
2、滚动数组优化。
反思:
初始化以及循环上下界的细节要考虑清楚。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int MOD = 1e6;
int c[1000 + 10];
int dp[2][100000 + 10];
int main()
{
int t, a, s, b;
scanf("%d%d%d%d", &t, &a, &s, &b);
for(int i = 0; i < a; i++)
{
int x; scanf("%d", &x);
c[x]++;
}
dp[0][0] = dp[1][0] = 1;
for(int i = 1; i <= t; i++)
{
for(int j = 1; j <= b; j++)
{
if(j <= c[i])
{
dp[i & 1][j] = (dp[i & 1][j - 1] + dp[(i - 1) & 1][j]) % MOD;
}
else
{
dp[i & 1][j] = (dp[(i - 1) & 1][j] + dp[i & 1][j - 1] - dp[(i - 1) & 1][j - 1 - c[i]] + MOD) % MOD;
}
}
}
int ans = 0;
for(int j = s; j <= b; j++)
{
ans = (ans + dp[t & 1][j]) % MOD;
}
printf("%d\n", ans);
return 0;
}