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]);
}