bzoj 1721: [Usaco2006 Mar]Ski Lift 缆车支柱

Description

Farmer Ron in Colorado is building a ski resort for his cows (though budget constraints dictate construction of just one ski lift). The lift will be constructed as a monorail and will connect a concrete support at the starting location to the support at the ending location via some number of intermediate supports, each of height 0 above its land. A straight-line segment of steel connects every pair of adjacent supports. For obvious reasons, each section of straight steel must lie above the ground at all points. Always frugal, FR wants to minimize the number of supports that he must build. He has surveyed the N (2 <= N <= 5,000) equal-sized plots of land the lift will traverse and recorded the integral height H (0 <= H <= 1,000,000,000) of each plot. Safety regulations require FR to build adjacent supports no more than K (1 <= K <= N - 1) units apart. The steel between each pair of supports is rigid and forms a straight line from one support to the next. Help FR compute the smallest number of supports required such that: each segment of steel lies entirely above (or just tangent to) each piece of ground, no two consecutive supports are more than K units apart horizontally, and a support resides both on the first plot of land and on the last plot of land.

科罗拉州的罗恩打算为他的奶牛们建造一个滑雪场,虽然需要的设施仅仅是一部缆车.建造一部缆车,需要从山脚到山顶立若干根柱子,并用钢丝连结它们.你可以认为相对于地面,柱子的高度可以忽略不计.每相邻两根柱子间都有钢丝直接相连.显然,所有钢丝的任何一段都不能在地面之下.    为了节省建造的费用,罗恩希望在工程中修建尽可能少的柱子.他在准备修建缆车的山坡上迭定了N(2≤N≤5000)个两两之间水平距离相等的点,并且测量了每个点的高度H(O≤日≤10^9).并且,按照国家安全标准,相邻两根柱子间的距离不能超过K(1≤K≤N-1)个单位长度.柱子间的钢丝都是笔直的. 罗恩希望你帮他计算一下,在满足下列条件的情况下,他至少要修建多少根柱子:首先,所有的柱子都必须修建在他所选定的点上,且每一段钢丝都必须高于地面或者正好跟地面相切.相邻两根柱子的距离不大于K个单位长度.当然,在第一个点与最后一个点上一定都要修建柱子.

Input

* Line 1: Two space-separate integers, N and K

* Lines 2..N+1: Line i+1 contains a single integer that is the height of plot i.


    第1行:两个整数N和K,用空格隔开.

    第2到N+1行:每行包括一个正整数,第i+l行的数描述了第i个点的高度.

Output

* Line 1: A single integer equal to the fewest number of lift towers FR needs to build subject to the above constraints

    输出一个整数,即罗恩最少需要修建的柱子的数目.

Sample Input

13 4
0
1
0
2
4
6
8
6
8
8
9
11
12

Sample Output

5

HINT

 样例说明


    罗恩最少要修建5根柱子(分别在第1,5,7,9,13个山坡上的点).钢丝在1-5,5-7,7-9以及12 - 13这4段上与地面相切.


不想写O(n^3)的算法。。想了个O(n^2)

因为各种问题所以错了好几次。

往前扫描维护斜率最小的然后如果当前点斜率小于最小斜率则转移即可。具体看代码吧


#include
#include
using namespace std;
int a[5001];
int f[5001];
int main()
{
     int n,k;
     scanf("%d%d",&n,&k);
     int i,j;
     for(i=1;i<=n;i++)
          scanf("%d",&a[i]);
     double mini;
     int minn;
     f[1]=1;
     for(i=2;i<=n;i++)
     {
          mini=2100000000;
          minn=0;
          f[i]=2100000000;
          for(j=i-1;j>=(i-k>0?i-k:1);j--)
          {
          	   if((double)(a[i]-a[j])/(double)(i-j)<=mini)
          	   {
          	   	    f[i]=min(f[j]+1,f[i]);
          	        mini=(double)(a[i]-a[j])/(double)(i-j);
          	        minn=j;
          	   }
          }
     }
     printf("%d\n",f[n]);
     return 0;
}



你可能感兴趣的:(DP)