左神演算法學習日記 樹dp

2021-09-20 21:45:00 字數 1539 閱讀 5512

樹dp問題只需要考慮每個結點的所有孩子的情況就可以解決 

class node

~node() }

};class treeinf

}; void creat(node* node)

if (r) }

//獲得子樹中結點最多的搜尋二叉樹的結點個數

treeinf* getmaxnode(node* node)

treeinf* leftinf = getmaxnode(node->left);//獲取左子樹的資訊

treeinf* rightinf = getmaxnode(node->right);//獲取右子樹的資訊

int curnum = 0;

//對於每個子問題主要根據兩種情況進行決策:1.整個左子樹和整個右子樹是搜尋二叉樹,2.左/右子樹的子樹為結點最多的搜尋二叉樹。

//根據這兩種情況進行判斷:當左右子樹都是搜尋二叉樹時,整個樹根據左子樹的最大值和右子樹的最小值來決定結點個數是否+1;

//當其中乙個子樹不是搜尋二叉樹時,則根據左右子樹的最大搜尋子樹的結點個數進行決策。為此我們需要:最大搜尋子樹的頭結點,子樹的最大值和最小值,最大結點個數

if (node->left == leftinf->head

&&node->right == rightinf->head

&&node->num > leftinf->max

&&node->num < rightinf->min)

curnum = leftinf->size + rightinf->size + 1;

int maxnode = max(curnum, max(leftinf->size, rightinf->size));//第一種情況,同時判斷當前樹是否為搜尋二叉樹

node* maxhead = leftinf->size>rightinf->size?leftinf->head:rightinf->head;//第二種情況,獲得最大搜尋子樹的頭結點

if (curnum)

maxhead = node;

return new treeinf(max(rightinf->max node->num),//獲得最大值,最大值只有整棵樹為搜尋二叉樹時才會用,因此我們這裡假設當前子樹是搜尋二叉樹

min(min(leftinf->min, node->num),//獲得最小值

maxhead, maxnode);

}class returninf

};//求乙個樹中距離最遠的兩個點之間的距離是多少,距離定義為從乙個點到另乙個點所要經過的點的個數,包括起始點本身。

returninf* maxdis(node* node)

class actnode

};class returnact

};//組織活動,員工的上一級領導在該員工必定不會參加,問怎麼邀請員工可以保障活躍的最高

returnact* getmaxact(actnode* head)

return new returnact(inact, offact);

}

左神演算法學習日記 堆(一)

一直覺得赫夫曼樹沒什麼diao用,沒想到這道題可以用赫夫曼樹,而且用小根堆可以實現赫夫曼樹,學到好多。題目二一塊金條切成兩半,是需要花費和長度數值一樣的銅板的。比如長度為20的金條,不管切成長度多大的兩半,都要花費20個銅板。一群人想整分整塊金條,怎麼分最省銅板?例如,給定陣列,代表一共三個人,整塊...

左神演算法學習日記 堆(二)

include include include include include include include includeusing namespace std class project project const project p push進堆時用到了拷貝建構函式,雖然不寫也無所謂 pro...

左神演算法學習日記 單鏈表(一)

最近在找實習工作,做個左神演算法的學習日記,方便以後鄙視自己。題一 判斷乙個鍊錶是否為回文結構 題目 給定乙個鍊錶的頭節點head,請判斷該鍊錶是否為回文結構。例如 1 2 1,返回true。1 2 2 1,返回true。15 6 15,返回true。1 2 3,返回false。高階 如果鍊錶長度為...