POJ 3003 DP 尋路 記錄路徑

2021-10-11 16:13:42 字數 1010 閱讀 7429

我一開始把m看成是每個a_i的上限了,這是致命的,因為這個題dfs暴力搜尋+剪枝是過不了的因為m<=40,全部狀態有2的四十次冪。

正解是dp,設dp[i][j]為在i處j高度的地方,蜘蛛俠所經歷的的最大高度的最小值,這個dp[i][[j]一定是由dp[i - 1]j - x和dp[i - 1][j + x](如果j + x不超過1000)轉移來的。由dp[i - 1][j - x]轉移的話說明這步是上,另乙個代表這步是下,分別按照對應的規則來轉移」所經歷的的最大高度的最小值「即可,最後檢查dp[m][0]有沒有值即可。

關於記錄路徑,這個對每乙個dp[i][j],記錄乙個pre[i][j]表示這步的「上一步的高度」,最後的時候進行dfs列印即可

ac**

#include

#include

int n, t;

int aa[

1005][

1005];

int pr[

1005][

1005];

void

b_print

(int o,

int x)

printf

(pr[o]

[x]< x ?

"u":

"d");}

intmain()

}for

(j =

0; j <=

1000

;++j)

aa[0]

[0]=

0;for(i =

1; i <= n;

++i)

if(j - xx >=

0&& aa[i -1]

[j - xx]

< aa[i]

[j]&& aa[i]

[j]> j)}}

if(aa[n][0

]==99999999

)else

printf

("\n");

}return0;

}

POJ 3003 DP 尋路 記錄路徑

我一開始把m看成是每個a i的上限了,這是致命的,因為這個題dfs暴力搜尋 剪枝是過不了的因為m 40,全部狀態有2的四十次冪。正解是dp,設dp i j 為在i處j高度的地方,蜘蛛俠所經歷的的最大高度的最小值,這個dp i j 一定是由dp i 1 j x和dp i 1 j x 如果j x不超過1...

poj3342 poj2342 樹形dp入門

poj3342 最近做樹形dp,渣渣 成喳喳喳辣,真是不開森。還是適合做基礎入門題。題意 比較好理解。就是一棵樹,選m個點,兒子和父親不能同時選。問最多能選多少個 題目中說的是上級,當然我這裡省略就是用父親節點和孩子結點表示啦 其實dp的內容很好想,d i 0 表示第i個點不選的結果,d i 1 表...

POJ 3254,POJ 1185(狀態壓縮DP)

poj 3254 corn fields 我們可以用二進位制列舉第一行狀態,用1代表在這種植,0代表不種植,第一行確定了,第二行就可以根據第一行不斷累加。dp row state 代表第row行用state狀態時的方法數。如果這個state合法,則dp row state dp row 1 stat...