必须优化dp数组,因为每次更新必须用到前一阶段和本阶段的数据,不能简单的把数组改成一维,我开了两个数组滚动使用
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxv=1e5+30; int mod=1000000; int t,a,s,b; int dp1[maxv]; int dp2[maxv]; int f[1005]; int main(){ freopen("in","r",stdin); cin>>t>>a>>s>>b; int kk; for(int i=1;i<=a;i++){ scanf("%d",&kk); f[kk]++; } memset(dp1,0,sizeof dp1); dp1[0]=1; int *now=dp2,*pre=dp1; for(int i=1;i<=t;i++){ for(int j=0;j<=a;j++){ now[j]=((now[j-1]+pre[j])%mod-(j-1-f[i]>=0?pre[j-1-f[i]]:0)+4*mod)%mod; } swap(now,pre); } int ans=0; for(int i=s;i<=b;i++) ans=(pre[i]+ans)%mod; cout<<ans<<endl; return 0; }