把数组开到极限,以及将可以在中间转化的值全部消除然后进行dp即可.

#include <bits/stdc++.h>
using namespace std;
const int mod=2*3*4*5*6*7*8*9*2;
const int N=1e2+5;
const int M=2e7+6e6+5e6;
int pos[N],val[N];
int  f[M];
bool vis[M];
int main()
{
    int l;cin>>l;
    int s,t,m;cin>>s>>t>>m;
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&pos[i]);
    }sort(pos+1,pos+1+m);
    pos[m+1]=pos[m]+t;
    m=m+1;
    for(int i=1;i<=m;i++)
    {
        val[i]+=val[i-1]+(pos[i]-pos[i-1])%mod;
        vis[val[i]]=true;
    }memset(f,0x3f,sizeof f);f[0]=0;
    for(int i=1;i<=val[m];i++)
    {
        for(int j=s;j<=t;j++)
        {
            if(i-j>=0) f[i]=min(f[i],f[i-j]+vis[i]);
        }
    }int ans=2e9;
    for(int i=val[m-1];i<=val[m];i++)
    {
        ans=min(ans,f[i]);
    }cout<<ans<<'\n';
    return 0;
}