NOIP2005 过河

题目: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;
}

你可能感兴趣的:(动态规划)