码迷,mamicode.com
首页 > 其他好文 > 详细

vijos p1002 dp ***

时间:2015-07-10 11:13:01      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

链接:点我

一开始的方程式很好写的,但是数据太大,考虑到石子数目很小,我们对其进行离散化,若相邻两点距离超过ya的值,则后面所有点都往前移动,这里ya的值是可以调整的

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=110;
const int maxdp=100001;
const int inf=100000000;
const int ya=75;
int len,s,t,n;
int cnt=0;
int a[maxn],dp[maxdp],v[maxdp];
int cmp(int x,int y)
{
    return x<y;
}
int main()
{
    cin>>len>>s>>t>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    a[n+1]=len;    a[0]=0;
    if(s==t)
    {
        for(int i=1;i<=n;i++)
            if(a[i]%s==0) cnt++;
        cout<<cnt;
        return 0;
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n+1;i++)
      if(a[i]-a[i-1]>ya)
      {
          int t=a[i]-a[i-1]-ya;
          for(int j=i;j<=n+1;j++) a[j]=a[j]-t;
      }
    memset(v,0,sizeof(v));
    for(int i=1;i<=n;i++) v[a[i]]=1;
    len=a[n+1];
    for(int i=0;i<maxdp;i++) dp[i]=inf;
    dp[0]=0;
    for(int i=1;i<=len;i++)
      for(int j=i-t;j<=i-s;j++)
          if(j>=0)
          dp[i]=min(dp[i],dp[j]+v[i]);
    cout<<dp[len];
    return 0;
}

 

vijos p1002 dp ***

标签:

原文地址:http://www.cnblogs.com/cnblogs321114287/p/4635043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!