题目链接:
http://poj.org/problem?id=1925
题意:
输入K组数据,每组数据输入n个柱子的信息,每个柱子信息为x坐标和高度h,蜘蛛侠需要从第一的柱子通过不断荡蛛丝荡到最后一个柱子,荡的规则:
1.蜘蛛侠不会撞到柱子上,假如他在高度为h的位置j通过柱子i前进,那么它会直接荡到同样高度为h位置为x[i]+x[i]-j的位置上,不会受中间柱子的阻挡(x[i]表示柱子i的x坐标)
2.蜘蛛侠在荡蛛丝的过程中一旦能荡到位置x,使得x>=x[n],则视为它荡到了最后一个柱子上(只适用于最后一个柱子)。
求最少的荡蛛丝的次数。
1 <= T <= 20,0 <= Xi, Yi <= 1000000,2 <= N <= 5000
题解:
注意它给出了初始的高度,每次荡完之后所处位置的高度与初始高度相同,因此高度仅仅用来判断能否荡蛛丝,对于状态转移并没有影响。
首先不考虑数据范围,我们很快可以想出一个N×X[n]的做法,类似于01背包,dp[j]表示到达位置j时所荡的最少次数,转移方程和01背包也没太大区别
for (int i=1;i<=x[n];