P1052 过河
题面:https://www.luogu.org/problemnew/show/P1052
dp方程很好推:f[i]=min(f[i],f[i-j])+stone[i];
但是要离散化,即将中间的距离mod 2520(1~10的最小公倍数)
Code:
#include<iostream>
#include<algorithm>
using namespace std;
const int N=105,M=350000;
int a[N],d[N],stone[M],f[M],l,s,t,m,ans;
int main(){
scanf("%d%d%d%d",&l,&s,&t,&m);
for(int i=1;i<=m;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+m+1);
for(int i=1;i<=m;i++){
d[i]=(a[i]-a[i-1])%2520;
}
for(int i=1;i<=m;i++){
a[i]=a[i-1]+d[i];
stone[a[i]]=1;
}
l=a[m];
for(int i=0;i<=l+t;i++){
f[i]=m;
}
f[0]=0;
for(int i=1;i<=l+t;i++){
for(int j=s;j<=t;j++){
if(i-j>=0){
f[i]=min(f[i],f[i-j]);
}
f[i]+=stone[i];
}
}
ans=m;
for(int i=l;i<l+t;i++){
ans=min(ans,f[i]);
}
printf("%d\n",ans);
return 0;
}