加分二叉樹(區間dp 樹的遍歷)

2021-10-09 22:15:25 字數 1385 閱讀 6278

題目鏈結

思路:這題明確說明樹的中序遍歷是1 2 3 …n ,所以我們任取其中一段子串行,一定滿足某顆子樹的中序遍歷 故而可以考慮用區間dp 。

邊界就是dp[i][i] ,另外用root[i][j]存i到j這段的根節點。

有個坑點,列舉乙個長度大於1的區間上的根的時候,根節點不可以出現在最右端,因為中序遍歷根節點不可能出現在最末尾。

//#pragma comment(linker, "/stack:102400000,102400000")//????

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define ll long long

#define ull unsigned long long

const

int inf=

0x3f3f3f

;const

double eps=

1e-5

;const

int maxn=40;

int n;

ll dp[maxn]

[maxn]

;int root[maxn]

[maxn]

;//i~j的根節點是哪個

//dp[i][j]=max(dp[i][j],dp)

void

dfs(

int left,

int right)

printf

("%d "

,root[left]

[right]);

dfs(left,root[left]

[right]-1

);//中序遍歷為1~n 所以直接-1

dfs(root[left]

[right]+1

,right);}

intmain()

for(

int r=

2;r<=n;r++

)//區間長度}}

} cout<

[n]<<

'\n'

;dfs(1

,n);

// system("pause");

return0;

}

區間DP 加分二叉樹

題目 設乙個n個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為 d i tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 su...

加分二叉樹(遞迴,區間DP)

演算法 區間dp,二叉樹的遍歷 狀態表示 f i j 表示中序遍歷是 w i j 的所有二叉樹的得分的最大值。狀態計算 f i j max f i k 1 f k 1 j w k 即將 f i j 表示 的二叉樹集合按根節點分類,則根節點在 k 時的最大得分即 為 f i k 1 f k 1 j w...

加分二叉樹 樹型DP

題目 設乙個n個節點的二叉樹tree的中序遍歷為 l,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第j個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 subt...