洛谷1052 過河

2022-04-28 20:33:12 字數 2491 閱讀 7693

傳送門^o^

只看題目描述 你會發現這是一道非常簡單的 dp 題

但是 資料範圍是l≤109 啊

30分解:就是很簡單的啊

1 #include2 #include3 #include4

#define go(i,a,b) for(register int i=a;i<=b;i++)

5#define yes(i,a,b) for(register int i=a;i>=b;i--)

6#define mem(a,b) memset(a,b,sizeof(a));

7#define ll long long

8#define db double

9using

namespace

std;

10int

read()

1114

while(c>='

0'&&c<='

9')

15return x*y;16}

17int

l,s,m,t;

18 ll ans,dp[300000

];19

bool f[300000

];20

intmain()

2132

if(i>=l) ans=min(ans,dp[i]);33}

34 printf("

%lld

",ans);

35return0;

36 }

30分 view code

再講一下我自己想的方法(但是寫了好久**也寫不對qwq):

前面的方法中 for(j,s,t) dp[i]=min(dp[i],dp[i-j]) (如果i處有石頭就再+1)

發現要求dp[i] 只要知道dp[i-t]~dp[i-s] 即可 前面的都對現在沒有影響

s,t<=10 範圍非常小就可以不要開之前的dp陣列了

又發現只要求 min(dp[i-t]~dp[i-s])

好像滑動視窗啊!!!

為了方便還可以用deque和queue

我覺得我說的好有道理啊  但是我寫不對qwq

$upd\ on\ 11.2:$我以前在想啥?這樣顯然過不了吖$qwq$

我看懂的

題解

:我們發現不能直接像之前30分的做法那樣dp

是因為l實在是太大了 開不了那麼大的陣列

所以我們就想能不能把l變得小一點

如圖 顯然灰色箭頭是可以走得到的地方(第i步走的最近和走的最遠之間的)

起初還有灰色箭頭覆蓋不到的地方

但是我們可以發現當紅色點和藍色點重合之後 灰色箭頭一定可以覆蓋到後面的每乙個點

而重合點即為s和t的最小公倍數lcm

當兩塊石頭之間的間隔大於lcm時 直接把它壓縮成lcm

但是要注意一種特殊的情況 就是當s==t時 特判即可

code

1 #include2 #include3 #include4 #include5

#define go(i,a,b) for(register int i=a;i<=b;i++)

6#define mem(a,b) memset(a,b,sizeof(a));

7#define m 90*100+10

8#define n 100+10

9using

namespace

std;

10int

read()

1114

while(c>='

0'&&c<='

9')

15return x*y;16}

17int

l,s,m,t,ans,a[n],b[n],dp[m];

18bool

f[m];

19int

main()

2031 go(i,1

,m)32

37 l=b[m]+t*s;

38 go(i,1

,l)39

45if(i>=b[m]) ans=min(ans,dp[i]);46}

47 printf("%d"

,ans);

48return0;

49 }

view code

至此 洛谷普及訓練場所有dp專題都通關啦(當然不是都完成了qwq)

^o^ 然後現在要去回顧一下原來寫過的dp題

洛谷 P1052 過河

題目 過河 思路 因為l的值太大,而實際有石子的地方卻並不多,所以要先進行離散化。即將每個石子之間的差距都控制在剛好比t大一點的位置,這樣就不會影響最終結果。令f i 表示跳過前i個位置需要最少踩得石頭數量,轉移方程f i min f i j cnt i f i j s,t 注意最後的輸出是min,...

洛谷 P1052過河

這個是題幹 這是一道noip2005年的提高組的題,那道題一看,就是要用動態規劃,狀態轉移方程也十分簡單。只需要考慮是從哪個地方來的,看看即將到達的點是否有石子。用一維陣列 f x 表示第x位的步數 額,這只是30分的寫法,l 的取值太大,陣列承受不了 之後,我又想騙一點分,就特判了一下s t的情況...

洛谷 P1052 過河

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