這個題目是個區間dp(為什麼會在洛谷的dfs裡面,我也不知道啊)
dfs啊呸,區間dp,顧名思義,就是在一段區間[l,r]上的dp(我在說什麼亂七八糟的,劃掉劃掉)。
乍一看這個題目,看似無從下手(可能只有我自己無從下手),其實仔細一分析,題目要,求最大值,我們就直接列舉樹根,然後把左右兒子按照題目要求的操作一波就好啦。
dp方程直接給出來了,很好理解 dp[i][j] = max(dp[i][j],dp[i][k-1]*dp[k+1][j]+dp[k][k]) ,其中dp[i][j]表示節點i到節點j的最大值。
1.首先列舉區間長度。
2.列舉左端點。
3.列舉根
先序遍歷就直接遞迴輸出root就好啦(先訪問根,然後輸出左邊,然後輸出右邊)。
還是直接看**:
#include using namespace std;
typedef long long ll;
const int maxn = 50;
ll dp[maxn][maxn];
ll root[maxn][maxn];
void init()
void print(int l,int r)
cout<>n)
for(int len = 1;lenps:等等,這是個樹形dp?
洛谷P1040 加分二叉樹 簡單區間DP
題目描述 設乙個n個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第ii個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 s...
洛谷P1040 加分二叉樹(樹形dp)
時間限制 1 sec 記憶體限制 125 mb 提交 11 解決 7 設乙個n個節點的二叉樹tree的中序遍歷為 l,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第j個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree...
洛谷 加分二叉樹,P1040
dp,整個樹是由中序遍歷1,n構成的,score i j 記錄的是中序遍歷為i,i 1,j 1,j的子樹的最高加分。tag i j 記錄的是中序遍歷為i j的子樹的根節點,用於重建前序遍歷。那最高加分的結果對應的是score 1 n dp的思路就是,先設定只有乙個節點的子樹的初值,即只含有根節點的子...