LIS問題分析

來源:互聯網
上載者:User

標籤:style   blog   http   color   2014   問題   

題目來源,待字閨中,原創@陳利人 ,歡迎大家繼續關注公眾帳號“待字閨中”

原題這個LIS問題,可不是Longest Increasing Subsequence,而是Largest Independent Set,含義如下:給定一棵二叉樹,找到滿足如下條件的最大節點集合:集合中的任意兩個節點之間,都沒有邊。如:


LIS大小為5,為{10,40,60,70,80}.

分析:首先還是遞迴思想,比如對於根節點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 data;int lis;//表示以當前節點為根時lis集合的大小,初始化為0,可以防止重複遞迴BinaryTreeNode* left;BinaryTreeNode* right;BinaryTreeNode(int val):data(val),lis(0),left(NULL),right(NULL){}};int LIS(BinaryTreeNode* root){if(root == NULL)return 0;if(root->lis)return root->lis;int numNotContainRoot = LIS(root->left)+LIS(root->right);//根節點不加入lisint numContatinRoot = 1;//根節點加入lisif(root->left) numContatinRoot+=LIS(root->left->left)+LIS(root->left->right);if(root->right)numContatinRoot+=LIS(root->right->left)+LIS(root->right->right);root ->lis = max(numNotContainRoot,numContatinRoot);//儲存當前根節點所在子樹的lis大小return root->lis;}

本代碼只代表個人觀點,如有錯誤,請指正,謝謝


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.