题目:http://www.luogu.org/problem/show?pid=1052#
分析:DP,需要状态压缩,然而并没有看懂复杂的压缩,只是采用了很菜的“超过100就压缩”法…
代码:
#include
#include
#include
using namespace std;
const int Tmax=105,MOD=100,Tmax2=10005;
int l,s,t,m,data[Tmax],f[Tmax2];
bool stone[Tmax2];
void init()
{
int i;
m++;data[m]=l;
sort(data+1,data+1+m);
memset(f,0x3f,sizeof(f));
for(i=1;i<=m;i++)
{
if(data[i]-data[i-1]>MOD)
data[i]=data[i-1]+(data[i]-data[i-1])%MOD;
stone[data[i]]=true;
}
for(i=s;i<=t;i++)
if(stone[i]==true) f[i]=1;
else f[i]=0;
return;
}
void work()
{
int i,j;
for(i=t+1;i<=data[m];i++)
{
for(j=s;j<=t&&i-j>=s;j++)
f[i]=min(f[i],f[i-j]);
f[i]+=stone[i];
}
printf("%d",f[data[m]]-1);
return;
}
int main()
{
int i;
scanf("%d%d%d%d",&l,&s,&t,&m);
for(i=1;i<=m;i++) scanf("%d",&data[i]);
if(s==t)
{
for(i=1;i<=m;i++)
if(data[i]%s==0) f[1]++;
printf("%d",f[1]);
return 0;
}
init();
work();
return 0;
}