洛谷 P1052 過河 離散化 DP

2021-10-23 14:29:06 字數 2448 閱讀 1111

題目

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

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

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

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

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

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

輸入 #1

1023

5235

67

輸出 #1

2
這個資料很靈異我們要考慮壓縮資料也就是離散化

排序然後判斷如果兩個相鄰石頭間距離<=t

∗s

<=t*s

<=t

∗ss ta

teme

nt+=

(roc

k[i]

−roc

k[i−

1]

)statement+=(rock[i]-rock[i-1])

statem

ent+

=(ro

ck[i

]−ro

ck[i

−1])

% t+

tt+t

t+t可以將橋長壓縮到10000

10000

1000

0以內 用乙個陣列p

pp儲存橋長離散後的分布情況

列舉跳躍的最小距離到最大距離動態能量轉移方程:

f [i

]=mi

n(f[

i],f

[i−j

]+di

stri

bute

[i])

f[i]=min(f[i],f[i-j]+distribute[i])

f[i]=m

in(f

[i],

f[i−

j]+d

istr

ibut

e[i])jj

j列舉的是跳躍的距離從離散化橋後第乙個點計算最小跳過石頭數在p到p

+t

p到p+t

p到p+

t之間都可以跳到終點

範圍為1到p

+t

1到p+t

1到p+

t

#include

#include

#include

#include

using

namespace std;

int rock[

105]

,f[10005

],l,s,t,m;

bool distribute[

105]

;//分布陣列

intmain()

f[0]=

0;for(

int i=

1;i<=statement+t;i++

)for

(int j=s;j<=t;j++)if

((i-j)

>=0)

f[i]

=min

(f[i]

,f[i-j]

+distribute[i]);

//dp

int ans=

0x3f

;for

(int i=statement;i<=statement+t;i++

)//列舉範圍

ans=

min(ans,f[i]);

//最少石頭

printf

("%d"

,ans)

;return0;

}

洛谷 P1052 過河 dp 離散化

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

洛谷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的點表示橋的終點。...