簡單來說,動態規劃就是用空間換取時間。先把算過的答案存起來,再用原有的東西計算出新的,避免重複計算答案。
有個背包能裝 W 重量的東西,有 n 樣物品,每種物品都有其價值 v 和重量 w,問能裝物品的最大價值?
給定兩組序列:
s1 : a1, a2, a3, a4......
s2 : b1, b2, b3......
一個子序列 ai, aj, ak...... 滿足 i < j
舉例來說,7122, 712, 71, 7 的子序列可以是
7122, 71, 7、712, 71等等
現在問兩序列的最長公共子序列?
int s[n], l[n]; // s = sequence, l = length
int LIS(){
for(int i = 0; i < n; i++) l[i] = 1;
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++)
if(s[i] < s[j])
l[j] = max(l[j], l[i]+1);
}
int max = 0;
for(int i = 0; i < n; i++)
if(max < l[i]) l[i] = max;
return max;
}vector<int> s;
int LIS(vector<int> s){
if(s.size() == 0) return 0;
vector<int> v;
v.push_back(s[0]);
for(int i = 1; i < s.size(); i++){
if(s[i] > v.back()) v.push_back(s[i]);
else *lower_bound(v.begin(), v.end(), s[i]) = s[i];
}
return v.size();
}