樹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。高階 如果鍊錶長度為...