寒假集訓 Find Metal Mineral

2021-06-29 00:09:09 字數 1176 閱讀 9131

題目鏈結

題意:給出一顆生成樹,1<=n<=10000,在某乙個節點有k個機械人(k<=10),然後機械人從這裡開始走,要求遍歷完節點,隨便停到什麼地方.求最少的路程總和.

題解: 樹形dp,關鍵是dp[u][i],i的定義,因為機械人可能從子樹再跑回來,然後為了避免重複討論,應該定義為:在u為根的子樹上停了幾個機械人.這樣定義肯定不會重複,重點就是之後的橫著怎麼dp過去.考慮最後乙個,列舉它:如果是0,那麼一定是只有乙個機械人進來然後繞了一圈走了,可以反證.如果是1,一定是1個,反證可以,之後i個就是i..... 然後就能這樣dp過去.定位也很關鍵,對於每乙個子樹的選擇是:必須只能選乙個的揹包.

重點:樹形dp中i的正確不重複定義,有效避免列舉,然後在這基礎上正確推出dp方程.

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define clr(a) memset(a, 0, sizeof(a))

#define rep(i, a, b) for(int i = a;i < b;i++)

#define rep_d(i, a, b) for(int i = a;i <= b;i++)

typedef long long ll;

using namespace std;

const int maxn = 10000 + 100;

int n, s, k, dp[maxn][20], vis[maxn];

struct info

;vectorg[maxn];

void dfs(int u)

//dp[u][0] = 0;

int tt = g[u].size();

//printf("---- %d\n", tt);

for(int m = 0;m < tt;m++)}}

}// if(flag == 0)

//

// }

}void solve()

int main()

rep_d(i, 1, n - 1)

solve();

}return 0;

}

寒假集訓總結

寒假的訓練以不太順利的結果結束。整個寒假訓練都是兩天一場學長抓的訓練賽,然後補題,由於自己比較菜以及一些莫名的因素,導致訓練賽打得比較差,尤其是後幾場。訓練賽沒能打好的原因可能與狀態關係確實很大,但其中肯定與實力有關吧。總結一下,這些題目,演算法和思維上難倒自己的好像也沒幾道 後來補出來的 但是賽場...

ACM寒假集訓

出自 南昌理工學院acm集訓隊 什麼是dfs?void dfs 狀態 a 1.判斷狀態是否合法。合法繼續執行,否則則回到上次呼叫 2.先下走一層,也就是呼叫dfs a void dfs 引數用來表示狀態 if 越界或者是不合法狀態 return if 特殊狀態 剪枝 return for 擴充套件方...

21 1 25寒假集訓

小菜雞的第三天 沒錯,第二天咕咕咕了 昨天的題單是牛客訓練賽74,3道簽到題只做出來2題,討論會的時候也沒有遇到特別有感觸的題就咕咕了,今天的題單是訓練賽73,三道簽到題磕磕碰碰ac了,什麼時候才能突破啊!題意 n個數判斷是否是等差數列 等比數列 等模數列中的一種 思路 非常常規,從前往後遍歷加三個...