TOP DOWN: 紀錄遞迴時的狀態 減少複雜度
BOTTOM UP: 用 DP 陣列與 for 迴圈紀錄狀態
TOP DOWN:
int f(int x){
if(x <= 1) return 1;
else return f(x-1)+f(x-2);
}
紀錄狀態:
int dp[N];
int f(int x){
if(dp[x]) return dp[x];
if(x <= 1) return dp[x] = 1;
else return dp[x] = f(x-1)+f(x-2);
}
1. 重複子問題
2.最佳子結構
(其中A~C是基本的轉移,DE 是 0/1 背包,F 是 LCS)
Longest Increasing Subsequence
(二分搜做法、離散化 + 資結、2021 初選 pC)
(分數背包、照 CP 值排序)
(\(O(n^3)\) 區間 DP)
\(dp[l][r]\) 表示把 \(a_l,a_{l+1},...,a_r\) 合併的最小價值
(玩遊戲問題、進階版題目點此)
(位元 DP dp[i][mask])