題目**,
原題這個lis問題,可不是longest increasing subsequence,而是largest independent set,含義如下:給定一棵二叉樹,找到滿足如下條件的最大節點集合:集合中的任意兩個節點之間,都沒有邊。如下圖:
lis大小為5,為.
分析:首先還是遞迴思想,比如對於根節點10,如果把10放入lis則,20和30不能放入,但它們的孩子40、50、60可以;如果不把10放入,則它的孩子20和30可以,如此可得遞迴方程式為
fun(root)=max(fun(root->left)+fun(root->right),1+fun(root->left->left)+fun(root->left->right)+fun(root->right->left)+fun(root->right->right));同樣,由於存在重複子問題,因此可以考慮動態規劃,但是對於樹來說,動態規劃需要特殊處理,因為我們沒辦法從下往上進行處理,這裡有乙個技巧,我們可以給樹節點新增乙個標誌lis,當該節點沒有訪問時lis初始化為0,訪問後lis儲存為當前節點的lis集合的大小,從而可以避免重複遞迴,具體見**:
struct binarytreenode
};int lis(binarytreenode* root)
本**只代表個人觀點,如有錯誤,請指正,謝謝 雙端LIS問題
從一列數中篩除盡可能少的數使得從左往右看,這些數是從小到大再從大到小的 網易 如下 include include using namespace std int find int arr,int len,int n return left int main int argc,char argv 從...
動態規劃 LIS問題
最長上公升子串行 longest increasing subsquence 即lis問題是動態規劃解決的乙個經典問題。例如輸入序列1 5 2 3 4 輸出最長上公升子串行的長度 4 子串行為1 2 3 4 動態規劃思路 dp i 為最長子序列最後乙個元素為元序列第i個元素是的最大長度,只要把前面比...
LIS問題的簡短
飛彈攔截 時間複雜度o nlogn 求最長上公升子串行時 dp p p代表最長不上公升子串行的子串行的編號從1開始增加,根據dw定理,最大的m編號即是最長上公升子串行的長度也是最少分成了m組非上公升子串行。include using namespace std int a 100010 dp1 10...