noip2005提高組過河

2021-06-23 01:22:15 字數 2189 閱讀 5996

介於被這道題折磨了一晚上,因此很有必要記錄下來做動態規劃及狀態壓縮中易錯事項。

題目大意

共m個石子,求青蛙每次以s到t步從座標0跳過座標l踩到的最小石子數。

樣例資料

輸入10

2 3 5

2 3 5 6 7

輸出資料範圍

1 <= l <= 10^9 1 <= s <= t <= 10,1 <= m <= 100

初看此題,可以想到動態規劃,遞推式為:

f[i]:=max+stone[i];

其中f[i]表示跳到座標i時踩到到最小石子數目

s<=k<=t

stone[i]為1,則該位置有石子,為0則該位置無石子。

注意到資料範圍,l非常巨大,而石子個數卻很小,說明石子稀疏(此處提醒我們做題注意資料範圍,或在聯賽時考慮部分分)。

通過此題學習狀態壓縮。

通過手算可以發現當中間一段均空時,f[i]值總為乙個數。那麼這一段可以變短,有很大一部分捨棄不算。所以可以手動改變兩石子間距離。

由於t<=10所以最大距離定為100

事實上青蛙可以以t-1和t跳完最小公倍數t(t-1)的距離,這裡方便而取t^2,本質一樣

當把石子壓縮後,就可以像上面一樣直接動規了。

那麼怎麼壓縮呢?

這裡也是程式實現時要注意的。

如果兩石頭間距離<100則保持相對位置不變,否則將距離改為100。由於在後面動規程式中只用到stone[i](i是位置座標),所以這裡只用填stone陣列即可。

用p計算壓縮後在數軸上的座標,然後賦值為1.

p:=0;

a[0]:=0;a[m+1]:=l;//假象0處有一塊石頭,l處有一塊石頭,方便處理a[1]和l壓縮後的位置,這是乙個技巧

for i:=1 to m+1 do

if a[i]-a[i-1]>100 then

begin

stone[p+100]:=1;

p:=p+100;

endelse

begin

stone[p+a[i]-a[i-1]]:=1;

p:=p+a[i]-a[i-1];

end;

l:=p;//l是壓縮完的長度,也可以看成最後乙個石頭的壓縮後位置(因為最後總要從l向後算t-1個)

注意有不能跳到的點,要適當標記。

program guohe;

var l,s,t,m,ans,i,j,p,tt:longint;

a:array[0..100]of longint;

f,stone:array[0..110000]of longint;

begin

read(l);

read(s,t,m);

for i:=1 to m do read(a[i]);

if s=t then

begin

for i:=1 to m do if a[i] mod t=0 then ans:=ans+1; //s=t直接計算,壓縮的話會有問題

write(ans);

endelse

begin

for i:=1 to m-1 do

begin

p:=i;

for j:=i+1 to m do

if a[j]100 then

begin

stone[p+100]:=1;

p:=p+100;

endelse

begin

stone[p+a[i]-a[i-1]]:=1;

p:=p+a[i]-a[i-1];

end;

l:=p;

f[0]:=0;

for i:=1 to l do f[i]:=maxlongint;動規要注意邊界!

for i:=s to t do f[i]:=stone[i];

for i:=t+1 to l+t-1 do

begin

ans:=maxlongint; //方便處理

for j:=s to t do

if ans>f[i-j] then ans:=f[i-j];

if ansf[i] then ans:=f[i];

write(ans);

end;

end.

NOIP2005提高組 過河

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

NOIP 2005提高組 過河(狀壓DP) 詳解

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

noip2005提高 過河 dp

由於l的範圍到了109,用普通dp做肯定是不成了 可以觀察到m的數量很小,dp在轉移的過程中有大量的無用轉移 可以想到壓縮範圍,問題是如何壓縮,觀察若s 9,t 10時,能到達的點,9,10,18,19,20,27,28,29,30,36,37,38,39,40.80,81,82,83,84,85,...