poj1661 dp 加強版的數字三角形

2021-08-19 11:37:52 字數 2372 閱讀 1784

help jimmy

description

"help jimmy" 是在下圖所示的場景上完成的遊戲。

場景中包括多個長度和高度各不相同的平台。地面是最低的平台,高度為零,長度無限。

jimmy老鼠在時刻0從高於所有平台的某處開始下落,它的下落速度始終為1公尺/秒。當jimmy落到某個平台上時,遊戲者選擇讓它向左還是向右跑,它跑動的速度也是1公尺/秒。當jimmy跑到平台的邊緣時,開始繼續下落。jimmy每次下落的高度不能超過max公尺,不然就會摔死,遊戲也會結束。

設計乙個程式,計算jimmy到底地面時可能的最早時間。

input

第一行是測試資料的組數t(0 <= t <= 20)。每組測試資料的第一行是四個整數n,x,y,max,用空格分隔。n是平台的數目(不包括地面),x和y是jimmy開始下落的位置的橫豎座標,max是一次下落的最大高度。接下來的n行每行描述乙個平台,包括三個整數,x1[i],x2[i]和h[i]。h[i]表示平台的高度,x1[i]和x2[i]表示平台左右端點的橫座標。1 <= n <= 1000,-20000 <= x, x1[i], x2[i] <= 20000,0 < h[i] < y <= 20000(i = 1..n)。所有座標的單位都是公尺。

jimmy的大小和平台的厚度均忽略不計。如果jimmy恰好落在某個平台的邊緣,被視為落在平台上。所有的平台均不重疊或相連。測試資料保證問題一定有解。

output

對輸入的每組測試資料,輸出乙個整數,jimmy到底地面時可能的最早時間。

sample input

1

3 8 17 20

0 10 8

0 10 13

4 14 3

sample output

23
我個人認為這題目就是加強版的數字三角形,因為在這道題中,如果我們從頂向下選擇路徑,當前最優解不一定是全域性的最優解,我們更應該採用自底向上的方法去做,從下面開始往上搜尋路徑,和數字三角形一樣,都是有兩個方向,不過那題是取最大值,而我們這題就取最小值,另外不同的是,這道題會有兩個入口,數字三角形其實是單單只是會有乙個入口(這個可能比較難形容,可以去畫畫圖)。

那麼講完相似之處,我們就用這種思想去dp。首先對於每一塊板我們都有左端點和右端點,那麼我們把來到第i塊板的最小距離分解成兩個子問題,就是從左邊進入這塊板的最小值,和從右邊進入這塊板的最小值,分別用dp[i][0],dp[i][1]去表示。對於這道題我們先預處理一下,先把大地當成最後一塊板,把起點當成第一塊板(左右端點重合的區間),把板從低到高排好序,然後對每一塊進行dp.

轉移方程:

dp[i][0]=c[i].h-c[k].h+min(dp[k][0]+c[i].a-c[k].a,dp[k][1]+c[k].b-c[i].a);
c[i].h-c[k].h//這是高度差

min(dp[k][0]+c[i].a-c[k].a,dp[k][1]+c[k].b-c[i].a)//這是對於第k塊板,從大地到左邊進入,和到從右邊進入的最小值,再加上它們到左端點的距離
然後dp[i][0]就出來了,同理dp[i][1]也是一樣。那麼這道題需要注意的幾個點,一是要判斷到底能不能跳到左右端點,而是判斷如果找到乙個點k和點i的值相差大於max,那麼從這個端點進入就是永遠不可能了。

#include #include #include #include #include using namespace std;

struct node

c[1009];

int cmp(node a,node b)

if(k==0)

}void rmove(int i)

else k--;

}if(c[i].h-c[k].h>max)

if(k==0)

}int main()

c[0].a=-20000;

c[0].b=20000;

c[0].h=0;

sort(c,c+n+1,cmp);//高度從小到大排序

for(i=1; i<=n+1; i++) //自底向上dp

//dp[i][0]表示第i塊板從左進入的最小值

//dp[i][1]表示第i塊板從右進入的最小值

printf("%d\n",min(dp[n+1][0],dp[n+1][1]));}}

tyvj數字統計 加強版

p1409數字統計 加強版 noip2010普及組複賽第一題加強版 請統計某個給定範圍 l,r 的所有整數中,數字2 出現的次數。比如給定範圍 2,22 數字2 在數2 中出現了1 次,在數12 中出現1 次,在數20 中出 現1 次,在數21 中出現1 次,在數22 中出現2 次,所以數字2 在該...

U108258 牛的編號 加強版)

題目 u108258 牛的編號 加強版 題解 先建一顆二叉樹,每個節點的值是這段區間的長度大小。然後從最後乙個,比如最後乙個是a i 因為比ans i 小的個數是a i 個,那麼ans i 應該就是第a i 1個,所以直接在1 n尋找沒有填充的第a i 1個 includeusing namespa...

xpath在HTML解析中的應用(加強版)

經過一番研究以後才發現原來libxml2其實已經內建了對html的解析 即使是不很規範的html。所以上篇 xpath在xhtml解析中的應用 完全是我學藝不精的產物。囧 不過好處是順便學習到了j7a7c7k7 兄推薦的tidy 用的是令狐提供的 tidylib 這也是個好東東。現在來看如何直接使用...