由於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 #includeview code4 #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()
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 的...