//如果mid 可以满足 那么mid+1也是可以满足,这样就可以二分答案、
//这样就可以二分答案、注意二分的最大值要超过 2*10^9
// 然后就可以dp判断这个mid 是否满足
// dp[i] , 表示 计算到 a[i] , a[i] 不变时需要最少的修改次数才可以满足 相邻差 mid
// 转移方程 dp[i] = min(dp[i],dp[j]+(i-j-1)) ; j < i && a[i]-a[j] <= (i-j)*mid ;
// 意思:如果a[i]-a[j] 满足 (i-j)*mid 那么 通过改变所有 j+1~i-1的数是可以满足条件的
#include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <algorithm> #define maxn 2002 #define INF 2000000001 #define LL long long using namespace std; int n , k ; LL a[maxn] ; int dp[maxn] ; int abs1( int a ){ return a >= 0 ? a : -a ;} int min1( int a , int b ){ return a > b ? b : a ;} bool find( LL mid ) { int i , j , u ; for( i = 1 ; i <= n+1 ; i++) dp[i] = i-1 ; dp[1] = 0 ; for( i = 2 ; i <= n ;i++ ) for( j = 1 ; j < i ;j++ )if(abs1(a[i]-a[j]) <= (i-j)*mid) dp[i] = min1(dp[i],dp[j]+(i-j-1)) ; for( i = 1 ; i <= n ;i++) dp[n+1] = min1(dp[n+1],n-i+dp[i]) ; if(dp[n+1] <= k)return true ; return false ; } int main() { int i ; LL mid , L , R ; //freopen("in.txt","r",stdin) ; while( scanf("%d%d" ,&n , &k ) != EOF ) { for( i = 1 ; i <= n ;i++) scanf("%I64d" , &a[i]) ; L = 0 ; R = INF ; // 二分答案 while( L <= R ) { mid = (L+R)>>1 ; if(find(mid))R = mid-1 ; else L = mid+1 ; } printf("%d ",R+1) ; } return 0 ; }