noip2005提高 過河 dp

2022-05-12 20:16:52 字數 1051 閱讀 1441

由於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,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120...

觀察到了一定限度以後,可以跳到任意乙個點;

所以可以根據這個壓縮,壓縮到100就可以了;

有乙個地方需要注意,若s=t,要特判,不能壓縮;

1 #include2 #include3 #include

4 #include5 #include6 #include7 #include8

using

namespace

std;

9const

int maxn=110,maxm=20000;10

intl,s,t,m,n;

11int

a[maxn];

12int

vis[maxm],f[maxm];

13void

init()

18void

work()

22else 23}

24if(s==t)

30 n=last;

31 memset(f,127,sizeof

(f));

32 f[0]=0;33

for(int i=0;i<=n+10;i++)

36int minn=(1

<<30

);37

for(int i=n+1;i<=n+10;i++)minn=min(minn,f[i]);

38 cout

40int

main()

view code

noip2005提高組過河

介於被這道題折磨了一晚上,因此很有必要記錄下來做動態規劃及狀態壓縮中易錯事項。題目大意 共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 初看此題,可以想到動態規劃...

NOIP2005提高組 過河

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

NOIP2005 狀壓DP 過河

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