核心代码如下:(反作弊)
flag=1;
for(int j=0;j<x[i-1];j++){
minn[j][0]=1145141919810;
for(int k=1;k<=siz[j];k++){
minn[j][k]=min(min[j][k-1],mp[j][k]);
}
}
for(int j=1;j<=m;j++){
dp[i][j]=1145141919810;
if(j<=l[i]||j>=h[i]&&h[i]!=0){
continue;
}
if(j!=m){
int orgp=(j%x[i-1]?j%x[i-1]:x[i-1]),step=(j-orgp)/x[i-1],top=orgp+(m-orgp)/x[i-1]*x[i-1];
dp[i][j]=min(dp[i][j],minn[orgq%x[i-1]][step]+siz[orgp%x[i-1]]-(top-j)/x[i-1]);
}
else{
for(int k=1;k<=m;k++)dq[i][j]=min(dp[i][j],dp[i-1][k]+(k=m?1:((m-k)%x[i-1]=0?(m-k)/x[i-1]:(m-k)/x[i-1]+1)));
}
if(j+y[i-1]<=m){
dp[i][j]=min(dp[i][j],dp[i-1][j+y[i-1]]);
}
if(i==n)ans=min(ans,dp[i][j]);
if(dp[i][j]<10000000ll&&h[i]!=0&&flg){
kmt++;flag=0;
}
}
如上,给dp值加一个偏移量方便维护每一个可能转移到这个点的点的贡献,最上面一排直接暴力