POJ 3003 DP 尋路 記錄路徑

2022-06-05 14:30:11 字數 828 閱讀 6584

我一開始把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");

}int main()

} 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");

} return 0;

}

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...