Gym - 101617D (Jumping Haybales)

Gym - 101617D (Jumping Haybales)_第1张图片

题意:每次只能向右或者向下跳k格以内的格子,"."才能跳,问跳到右下角最少需要几步,如果不能到达输出”-1“。

思路:对每一个”.“,只可能从左边K-1格或者从上面k-1格过来,那么最小步数只要取,这些数据中,最小的步数+1即可。这里求最小,需要用到线段树。

#include
#include
#include
#include
#include
#define inf 9999999
using namespace std;
 
int n,k;

void up(int &x,int y) {
	x=min(x,y);
}
struct node{//求最小值的线段树 
	#define lson (rt << 1)
	#define rson (rt << 1 | 1)
	#define mid (l+r>>1)
	int minn[2005*4];
	void build(int l,int r,int rt) {
		minn[rt]=inf;
		if (l == r)return;
		build(l,mid,lson);
		build(mid+1,r,rson);
	}
	void update(int l,int r,int x,int y,int rt) {
		up(minn[rt],y);
		if (l == r)return ;
		if (x <= mid) update(l,mid,x,y,lson);
		else update(mid+1,r,x,y,rson);
	}
	int query(int l,int r,int x,int y,int rt) {
		if (l==x&&r==y)return minn[rt];
		if(mid>=y)return query(l,mid,x,y,lson);
		else if(mid


你可能感兴趣的:(线段树,dp)