NOIP 搜尋與動態規劃 動態規劃重難點習題詳解

2022-06-28 02:30:16 字數 1633 閱讀 1701

1.      動態規劃習題講解:

例題2-6:過河(noip2005)

【問題描述】在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點:0, 1, ... , l(其中l是橋的長度)。座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從橋的起點開始,不停的向終點方向跳躍。一次跳躍的距離是s到t之間的任意正整數(包括s,t)。當青蛙跳到或跳過座標為l的點時,就算青蛙已經跳出了獨木橋。題目給出獨木橋的長度l,青蛙跳躍的距離範圍s,t,橋上石子的位置。你的任務是確定青蛙要想過河,最少需要踩到的石子數。

【輸入】輸入第一行有乙個正整數l(1≤l≤109),表示獨木橋的長度。第二行有三個正整數s,t,m,分別表示青蛙一次跳躍的最小距離,最大距離,及橋上石子的個數,其中1≤s≤t≤10,1≤m≤100。第三行有m個不同的正整數分別表示這m個石子在數軸上的位置(資料保證橋的起點和終點處沒有石子)。所有相鄰的整數之間用乙個空格隔開。

【輸出】輸出只包括乙個整數,表示青蛙過河最少需要踩到的石子數。

【分析】本題乍一看上去好像很簡單,因為只要沿著青蛙跳的方向,逐步遞推即可。用f(i)記錄走到位置i時,最少踩到的石子數,狀態轉移方程為:

f(i) = min+a(i) 其中  i-t<=j<=i-s

時間複雜度為o(tl),空間複雜度為o(tl)。仔細觀察題目,發現l的數字特別大,直接進行上述動態規劃在時空間上都吃不消。

再次觀察題目,發現s和t的值非常小,m的值也非常小,兩顆石子之間有可能會有很大空隙,樸素動態規劃在時間和空間上都很浪費。用石子作為階段,石子前後若干空格作為狀態,可將原狀態修改為g(k,x),其中k為第k顆石子,x為與該石子距離為x的空格(-st≤x≤st)。那麼,跳躍的過程即為從第k-1個石子的右邊跳到第k個石子的左邊,然後從第k個石子的左邊,再跳到第k個石子的右邊。狀態轉移函式為:

其中,move(x)表示青蛙是否可以跳x格空格(如果可以為1,否則為0),可以由s和t預處理。最終的解為最後一顆石子的右側所有值中的最小值。

時間複雜度為o((st)2m),空間複雜度為o(stm)。

例題2-7:01揹包問題

【問題描述】有n件物品和乙個容量為c的揹包。第i件物品的重量是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。

【分析】經典的揹包問題。定義f(i,c)表示將前i個物品裝入容量為c的揹包中所獲得的最大價值。狀態轉移方程為:

f(i,c) = max

初值為f(0,c)=0(c=0...c),邊界條件為f(i,c)=負無窮(c<0)。時間複雜度為o(nc),空間複雜度為o(nc)。

實際上,觀察狀態轉移方程,f(i,c)的值只與f(i-1,c』)的值有關,因此,可用滾動陣列壓縮狀態至2c。再次觀察狀態轉移方程,發現c'for i=1 to n

mysql動態規劃 動態規劃

動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...

vijos1476 旅遊規劃 動態規劃

傳送門 題解 我是這麼做的,首先第一遍求出每個點向下的不相交的最長鏈和次長鏈,這樣兩條鏈拼起來就是就是過這個點 不包含他的父親的情況下 的最長鏈。在這些最長鏈中取max就可以得到直徑。然後乙個點在直徑上,要麼他本身就在已經求出的最長鏈上 就是從這個點出發的最長 次長鏈 直徑長度 要麼如果這個點在某一...

矩陣連乘 動態規劃 動態規劃解矩陣連乘問題

一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 1 尋找最優子結構 假設我們已經找到父矩陣鏈最優解,當我們劃分到最後一步時都是兩個子矩陣鏈 分別被括號包圍 相乘,如 a1a2a3a4 a5a6a7...