一、思路
題目是多叉樹,原本想
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現在這顆樹枝條太多了,需要剪...