洛谷 P1052 過河 dp 離散化

2021-08-29 09:53:54 字數 2203 閱讀 7275

在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點:0,1,…,l(其中l是橋的長度)。座標為0的點表示橋的起點,座標為ll的點表示橋的終點。青蛙從橋的起點開始,不停的向終點方向跳躍。一次跳躍的距離是ss到tt之間的任意正整數(包括s,t)。當青蛙跳到或跳過座標為l的點時,就算青蛙已經跳出了獨木橋。

題目給出獨木橋的長度l,青蛙跳躍的距離範圍s,t,橋上石子的位置。你的任務是確定青蛙要想過河,最少需要踩到的石子數。

第一行有1個正整數l(1≤l≤1e9 ),表示獨木橋的長度。

第二行有3個正整數s,t,m,分別表示青蛙一次跳躍的最小距離,最大距離及橋上石子的個數,其中1≤s≤t≤10,1≤m≤100。

第三行有m個不同的正整數分別表示這m個石子在數軸上的位置(資料保證橋的起點和終點處沒有石子)。所有相鄰的整數之間用乙個空格隔開。

乙個整數,表示青蛙過河最少需要踩到的石子數。

102 3 5

2 3 5 6 7

對於30%的資料,l≤10000;

對於全部的資料,l≤1e9;

思路 : 首先,不考慮資料的話,顯然是乙個很簡單的揹包狀態轉移方程為 dp[

i]=m

in(d

p[i]

,dp[

i−j]

+vis

[i])

(s

<=j

<=t

)dp[i] = min(dp[i] ,dp[i-j] + vis[i] ) (s <= j <= t)

dp[i]=

min(

dp[i

],dp

[i−j

]+vi

s[i]

)(s<=j

<=t

)但是資料是1e9的話開陣列顯然是不現實的 ,因此我們要考慮離散化

兩點間的距離 len 大於 t 時,一定可以由 len % t 跳過來,所以最多隻需要 t + len % t 種距離的狀態就可以表示這兩個石子之間的任意距離關係 , 對於相鄰的兩個位置 之間的距離 len , 如果 len % t + t 小於 len 則兩個點之間的距離就是 len % t + t 否則 距離是 len

ac code :

#include

#include

#include

#include

using namespace std;

const

int maxn =

200000

;typedef

long

long ll;

ll l ;

int s ,t ,n ,dp[maxn]

,v[maxn]

,vis[maxn]

;int

main()

v[++n]

= l ;

sort

( v +

1, v + n +1)

;memset

(vis ,0,

sizeof

(vis));

int pos =

0,lenght =0;

for(

int i =

1; i <= n ; i ++

)else

vis[lenght]=1

; pos = v[i];}

memset

(dp ,

0x3f3f3f3f

,sizeof

(dp));

dp[0]

=0; lenght +

= t *2;

for(

int i =

0; i <= lenght - s ; i ++)}

int minn =

0x3f3f3f3f

;for

(int i = lenght -

2* t ; i <= lenght ; i ++

)// printf("lenght = %d\n",lenght) ;

// for (int i = 0 ; i <= lenght ; i ++ ) printf("\n");

printf

("%d\n"

,minn )

;return0;

}

洛谷 P1052 過河 離散化 DP

題目 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從...

洛谷P1052 過河 dp

題目大意 獨木橋長度l,橋上有m個石頭,要過橋,起點0,只要跳到或者跳過l都算過了,每次跳躍距離是s t之間的整數值,問跳過橋最少需要踩到的石子數 dp i 表示跳躍了距離i,最少需要踩到的石子數。stone i 表示在距離i有無石頭。狀態轉移方程 dp i min dp i dp i j ston...

洛谷P1052 過河(dp)

題目描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為ll的點表示橋的終點。...