把数组开到极限,以及将可以在中间转化的值全部消除然后进行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; }