递归的方法会超时。
只有靠递推解决。
递推:
#include<cstdio>
#include<cstring>
int l,s,t,n;
int DP[100010]={};
int main()
{
while(~scanf("%d%d%d%d",&l,&s,&t,&n))
{
memset(DP,0,sizeof(DP));
for(int i=1;i<=n;i++)
{
int temp;
scanf("%d",&temp);
DP[temp]=1;
}
int ans=0;
for(int i=l-t;i>=0;i--)
{
int temp=DP[i+s];
for(int j=s+1;j<=t;j++)
{
if(DP[i+j]<temp) temp=DP[i+j];
}
DP[i]+=temp;
}
printf("%d\n",DP[0]);
}
return 0;
}
递归:
#include<cstdio>
#include<cstring>
int l,s,t,n;
int DP[100010]={};
bool stone[100001]={};
int dp(int g)
{
if(DP[g]!=0) return DP[g];
if(stone[g]==1) DP[g]+=1;
if(g+t>=l) return DP[g];
int key=dp(g+s);
for(int i=s+1;i<=t;i++)
{
int temp=dp(g+i);
if(temp<key) key=temp;
}
DP[g]+=key;
return DP[g];
}
int main()
{
while(~scanf("%d%d%d%d",&l,&s,&t,&n))
{
memset(DP,0,sizeof(DP));
memset(stone,0,sizeof(stone));
for(int i=1;i<=n;i++)
{
int temp;
scanf("%d",&temp);
stone[temp]=1;
}
printf("%d\n",dp(0));
}
return 0;
}