區間dp 洛谷P1040

2021-08-29 05:28:20 字數 654 閱讀 3115

這個題目是個區間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的思路就是,先設定只有乙個節點的子樹的初值,即只含有根節點的子...