Vijos p1002 过河 (DP+状态压缩)

转载请注明出处:http://blog.csdn.net/a1dark

分析:DP方程很容易推出来、但是10^9怎么也会超时、O(N)也不行、由于M很小、于是产生了许多无用的状态、可以进行状态压缩、相当于重新离散化建图、比例自己选择、最好选择S-T的最小公倍数、其他的也可以、在一定范围内就行、

#include
#include
using namespace std;
#define MOD 2025
int dist[105];
int dp[3000005];
int vis[3000005];
int l,m,s,t;
int main()
{
    scanf("%d",&l);
    scanf("%d%d%d",&s,&t,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&dist[i]);
    }
    sort(dist+1,dist+m+1);
    dist[m+1]=l;
    for(int i=1;i<=m+1;i++)
    {
        if(dist[i]-dist[i-1]>100)
            dist[i]=dist[i-1]+(dist[i]-dist[i-1])%MOD;
    }
    l=dist[m+1];
    for(int i=1;i<=m;i++)
        vis[dist[i]]=1;
    for(int i=1;i<=l+t;i++)
        dp[i]=m;
    dp[0]=0;
    for(int i=1;i<=l+t;i++)
    {
        for(int j=s;j<=t;j++)
        {
            if(i>=j)
            dp[i]=min(dp[i],dp[i-j]+vis[i]);
        }
    }
    int ans=m;
    for(int i=l;i<=l+t;i++)
    {
        if(ans>dp[i])
            ans=dp[i];
    }
    printf("%d\n",ans);
    return 0;
}


你可能感兴趣的:(ACM竞赛)