愚蠢的礦工 樹形動態規劃

2021-06-14 01:52:22 字數 1168 閱讀 8236

一、思路

題目是多叉樹,原本想

0                       0 0 3  =0 1 2 =0  2 1 = 0 3 1 但是要列舉的情況太多,就採用轉換為二叉樹的方法

1 2 3

1、讀進多叉樹tree[1001][1001]

tree[i][0]來記錄本節點的孩子個數

tree[i][j]表示節點i的第j個子節點的編號

2、轉化為二叉樹binarytree[1001][1001]

遞迴生成

先將第乙個節點放到左孩子,並生成該節點的根子樹

將兄弟節點放到當前生成節點的右孩子處,並生成該節點的根子樹

3、記憶化搜尋求解

分為三種情況

(1)只取根節點

(2)左孩子取i 右孩子取m-i-1 根節點取1 其中i [0, m-1]

(3)只取右孩子,因為是兄弟節點,所以根節點可以不留人,右孩子取m個人 根節點 和 左孩子都取0個人

取其中最大值

4、問題

第一次寫完之後,超時乙個點,錯誤結果乙個點

看題解,將cin讀取方式改為了scanf,時間縮短了很多

ac了效率還是很明顯的

5、**如下:

#include #include int tree[1001][1001], binarytree[1001][1001], dptree[1001][1001];

int value[1001];

void converttobinarytree(int root)

currentroot = binarytree[root][1] = tree[root][1];

converttobinarytree(currentroot);

for (i=2; i<=tree[root][0]; i++) }

void printtree(int t[1001][1001], int n)

//讀進多叉樹

for (i=1; i<=n; i++)

//多叉樹轉換為二叉樹

converttobinarytree(0);

//列印樹

//printtree(tree, n);

//printbinarytree(binarytree[0][1]);

//樹形動規最優值

cout<

codevs1486愚蠢的礦工(樹形dp)

時間限制 1 s 空間限制 128000 kb stupid 家族得知在hyc家的後花園裡的 花壇處,向北走3步,向西走3步,再向北走3步,向東走3步,再向北走6步,向東走3步,向南走12步,再向西走2步 就能找到寶藏的入口,而且寶藏都是藏在山里的,必須挖出來,於是stupid家族派狗狗帶領礦工隊去...

題目 stupid 愚蠢的礦工

背景stupid 家族得知在hyc家的後花園裡的 花壇處,向北走3步,向西走3步,再向北走3步,向東走3步,再向北走6步,向東走3步,向南走12步,再向西走2步 就能找到寶藏的入口,而且寶藏都是藏在山里的,必須挖出來,於是stupid家族派狗狗帶領礦工隊去挖寶藏.hyc家的寶藏被狗狗挖走後有什麼感想...

樹形動態規劃

description 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1現在這顆樹枝條太多了,需要剪...