#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const long long Mod=1000000;
const int M=1010;
long long num[M],dp[2][10010]; // dp[i][j] 前i种选j个的方法数 dp[i][j]=k=0~num[i]∑dp[i-1][j-k] 展开优化
int main() //dp[i][j]=k=0~num[i]∑dp[i-1][j-1-k]+dp[i-1][j]-dp[i-1][j-1-num[i])
{
int t,a,s,b; //k=0~num[i]∑dp[i-1][j-1-k]= dp[i][j-1]
cin>>t>>a>>s>>b;
memset(num,0,sizeof(num));
memset(dp,0,sizeof(dp));
for(int i=0;i<a;i++)
{
int x;
cin>>x;
num[x]++;
}
dp[0][0]=dp[1][0]=1; // 选0个 方法数为1 即空集
for(int i=0;i<t;i++)
{
for(int j=1; j <= b;j++)
{
if(j-1-num[i+1]>=0)
{
dp[(i+1)&1][j]=(dp[(i+1)&1][j-1]+dp[(i)&1][j]-dp[i&1][j-1-num[i+1]]+Mod)%Mod;
}
else
{
dp[(i+1)&1][j]=(dp[(i+1)&1][j-1]+dp[i&1][j]+Mod)%Mod;
}
// +Mod 防止为负
}
}
int ans=0;
t=t&1; //滚动数组优化
for(int k=s;k<=b;k++)
{
ans=(ans+dp[t][k])%Mod;
}
cout<<ans<<endl;
return 0;
}
poj 3046 dp计数 展开优化
最新推荐文章于 2019-08-25 10:41:00 发布