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