题目链接:https://vjudge.net/problem/HRBUST-1186
思路:从后向前看:dp[i]=dp[i]+min(dp[i+j]) --- j属于[s,t]
dp[i]表示从L到 i(数轴上的长度) 花费的最小步数,i为石子点则设为1,否则设为0
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+20;
const int INF=0x3f3f3f3f;
int L,s,t,n,x;
int dp[maxn];
int main ()
{
while(scanf("%d%d%d%d",&L,&s,&t,&n)!=EOF){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
cin>>x;
dp[x]=1;
}
//倒着看 dp[t]=dp[t]+dp[t+k] k属于s--t
for(int i=L;i>=0;i--){
int m=INF;
for(int j=s;j<=t;j++){
m=min(m,dp[i+j]);
}
dp[i]+=m;
}
cout<<dp[0]<<endl;
}
return 0;
}