我一開始把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...