思路:尋找最大的權值,可以是dp,也可以用dfs來進行搜尋,dfs(l, r)表示從l到r的最大權值的子樹。那麼就可以寫出遞迴 :
temp = dfs(l, i - 1) * dfs (i + 1, r) + a[i]
這個遞迴就可以計算出的最大權值。用 num[l][r] 儲存下來,同時再用另外乙個陣列記錄計算最大權值所經過的結點。
** :
#include using namespace std;
#define max_n 40
int n;
int a[max_n];
int num[max_n][max_n] = ;
int ans[max_n][max_n] = ; // 用來儲存結點
int dfs (int l, int r)
if (num[l][r]) return num[l][r];
for (int i = l; i <= r; i++)
} return num[l][r];
}void solve (int l, int r)
}int main()
洛谷 P1040 加分二叉樹
題目描述 設乙個n個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 su...
洛谷 P1040 加分二叉樹
題目描述 設乙個n個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 su...
洛谷P1040 加分二叉樹
設乙個 n 個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字 1,2,3,n 為節點編號。每個節點都有乙個分數 均為正整數 記第 i 個節點的分數為 di,tree 及它的每個子樹都有乙個加分,任一棵子樹 subtree 也包含 tree 本身 的加分計算方法如下 subtree 的左子...