題目
在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點: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
輸出 #11023
5235
67
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的點表示橋的終點。...