動態規劃 NOIP2003 加分二叉樹

2021-08-09 23:44:36 字數 939 閱讀 4649

題目

感覺這個題挺難的啊 畢竟dp很弱

乙個比較經典的樹形dp

我們用f[i][j]表示區間i~j的最大加分 dp[i][j]表示區間i~j的最大加分時的根節點是什麼 所以初始化f[i][i] = a[i] dp[i][i] = i

然後就是迴圈列舉區間 然後在每個區間中在列舉根節點 如果發現當前區間的左子樹的加分×右子樹的加分 + 根的分數大於當前的f[i][j]就更新

最後還要輸出乙個前序遍歷 也就是頭左右 深搜一下即可

**如下

#include

#include

#include

using

namespace

std;

#define in = read()

typedef

long

long ll;

typedef

unsigned

int ui;

const ll size = 100 + 1;

int n , l , r;

int a[size] , f[size][size] , dp[size][size];

inline ll read()

while(isdigit(ch))

return num*f;

}void dfs(int x , int y)

int main()

int j;

for(register

int u=2;u<=n;u++)

for(register

int i=1;i+u-1

<=n;i++)}}

printf("%d\n" , f[1][n]);

dfs(1 , n);

return0;}

//coyg

NOIP2003 加分二叉樹 動態規劃

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

NOIP 2003 加分二叉樹

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

NOIP 2003 加分二叉樹

評測傳送 這個題可以記憶化搜尋做的。注意邊界條件。對於先序遍歷,遞迴就可以了 在dfs的時候用乙個陣列記錄根節點就可以了 include include include include include include define ll long long using namespace std i...