題幹在最後
首先承認這道題用了我很多的時間,作為乙個動態規劃入門者兼vj新手,這道題對我來講是比較有難度的。
感想就是,設定判斷條件時,一定要考慮全面,不要怕**長;
然後就是,對於動態規劃,不應只把他當作一種套路甚至是解體模版;這樣的話,你就總是想「拿條件,套公式」,對於dp,這種思想是危險而又行不同的。
我覺得更應該把dp當作一種思想,解決、看待這類問題的一種角度,如果說對於dp題有套路,這個套路只能是dp的思想,而不應該包含**之類的東西。
在做這道題的同時我就犯了上述錯誤,在重新看了一遍北大的《演算法基礎》關於遞迴的部分後,我基本獨立的寫出來了自己的ac**。
網上有很多這道題的解析,但我覺得對入門者都不夠友好,而且寫的很雜亂,如果你也在入門dp,希望我的分享能對你有幫助。
入門者的dp問題分析:
在做dp問題時,可以先用遞迴的思想去考慮問題,先分解出整個求解過程中,其中乙個完整的遞迴過程,然後考慮邊界條件;
對於這道題,我把從某平板的一端落下,再左右移動到所在平板的左or右端作為乙個「完整的遞迴過程」,如圖:
其中四條鉛筆線都可以看作乙個完整的遞迴過程,如果你還不明白的話:
鉛筆線的起點到底部的最小路程,就等於鉛筆線這條曲線的長度,加上終點到底部的最短路程;
對於小老鼠一開始的下落,這個遞迴過程也是適用的。
這裡的遞迴,就是「歸」到了「求乙個點到底部的最短距離」這個問題上,也就是上面這句話的高亮部分。
左右端點下落情況非常相似,我們要分開求,最終比較的就是,小老鼠一開始下落時,從板子左邊掉下去和從右邊掉下去那個路程更短。
邊界條件:如果點下方沒有板子了,那就不再遞迴,而是返回點的高度(也就是點所在板子的高度)。
然後問題是,如何判斷端點下面有沒有板子呢?
這裡,點的下方可能有板子,也可能沒有板子,也可能有許多板子,很自然能能想到的辦法是,我們將板子按高度排序,判斷我們點所在的板子下方的那塊板子,是不是在端點下方;這個判斷就不難了,只需判斷我們(小老鼠)所在板子的端點與下面那塊板子的左右端點的關係就能得出結論。
再然後,當用遞迴的函式直接求解dp問題時,中間過程往往會出現,某乙個問題重複多次求解的現象(不理解的同學可以看看北大《演算法基礎》慕課第四章第一節,講的非常好),浪費了時間與空間資源,這時我們的策略是,把每乙個求解過的問題都存起來,下一次要求這個問題時就直接使用結果了。
因此,根據我們所找出的遞迴過程的特點,我們從下往上求,這樣上面的就可以用下面的板子端點的結果了;
一直求到最高點,那麼最終結果就是左側下落,和右側下落,結果中的最小值了。
其中注意結構體排序的'>' '
#include
#include
#include
#include
using namespace std;
#define maxn 1000+10
#define inf 100000000
int x,y,np,mh,lmt[maxn],rmt[maxn];
struct flat
}if(x==-1)
}if(x==-1)
return rmt[np]>=lmt[np]?lmt[np]:rmt[np]; //求最小值
}int main()
sort(f,f+np+1); //公升序
// cout題意:"help jimmy" 是在下圖所示的場景上完成的遊戲。
場景中包括多個長度和高度各不相同的平台。地面是最低的平台,高度為零,長度無限。
jimmy老鼠在時刻0從高於所有平台的某處開始下落,它的下落速度始終為1公尺/秒。當jimmy落到某個平台上時,遊戲者選擇讓它向左還是向右跑,它跑動的速度也是1公尺/秒。當jimmy跑到平台的邊緣時,開始繼續下落。jimmy每次下落的高度不能超過max公尺,不然就會摔死,遊戲也會結束。
設計乙個程式,計算jimmy到底地面時可能的最早時間。
POJ1661 暴搜 剪枝
time limit 1000ms memory limit 10000k total submissions 16271 accepted 5427 description help jimmy 是在下圖所示的場景上完成的遊戲。場景中包括多個長度和高度各不相同的平台。地面是最低的平台,高度為零,長...
POJ1661Help Jimmy(動態規劃)
description help jimmy 是在下圖所示的場景上完成的遊戲。場景中包括多個長度和高度各不相同的平台。地面是最低的平台,高度為零,長度無限。jimmy老鼠在時刻0從高於所有平台的某處開始下落,它的下落速度始終為1公尺 秒。當jimmy落到某個平台上時,遊戲者選擇讓它向左還是向右跑,它...
poj 1661 Help Jimmy 動態規劃
題意 給n個用左端點 右端點 高度標識的平台,問乙個下落速度,移動速度均為1的點下落到地面的最小時間,其中每次下落距離不能超過輸入值max.分析 動態規劃ldp i 表示從第i塊木板左邊下落到地面的最小時間,rdp i 表示從第i塊木板右邊下落到地面的最小時間。poj 1661 sep9 inclu...