bzoj1721 [Usaco2006 Mar]Ski Lift 缆车支柱(dp)

f [ i ]表示前 i 个柱子最少选f[ i ]个,维护斜率。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,m;
ll high[5005];
ll f[5005];
int main()
{
    scanf("%lld %lld",&n,&m);
    high[0]=0;
    for(ll i=1;i<=n;i++)
    {
        scanf("%lld",&high[i]);
    }
    memset(f,0x3f,sizeof(f));
    f[1]=1;
    for(ll i=2;i<=n;i++)
    {
        double minn=999999999;//0x3f3f3f3f挂。
        for(ll j=i-1;j>=i-m;j--)
        {
            if(j<=0)break;
            if((double)(high[i]-high[j])/(double)(i-j)<=minn)//注意:再设一个变量K表示斜率,用K和minn比较就会WA。。。
            {
                f[i]=min(f[i],f[j]+1);
                minn=(double)(high[i]-high[j])/(double)(i-j);
            }
        }
    }
    printf("%lld",f[n]);
}


发布了59 篇原创文章 · 获赞 1 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章