這個是我的第一道樹型DP的題
解題思路:
首先添加一個0節點這樣可以簡化.
根據子節點用多重揹包算出根節點
代碼:
/* ID: mnlm1991 PROG: hdoj 1561 the more the better LANG: C++ */ #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<vector> #include<algorithm> #include<string> #include<map> #include<set> #include<bitset> #include<queue> #include<iostream> using namespace std; const int MaxN = 202; int son[MaxN]; int brother[MaxN]; int value[MaxN]; int dp[MaxN][MaxN]; void Init() { memset(brother, -1, sizeof(brother)); memset(son, -1, sizeof(son)); value[0] = 0; memset(dp, 0, sizeof(dp)); return; } void Insert(int x, int y, int i) { value[i] = x; if (son[y] == -1) { son[y] = i; } else { y = son[y]; while (brother[y] != -1) { y = brother[y]; } brother[y] = i; } return; } int Deal(int i, int M) { int k; int ret = 0; int v[MaxN]; int w[MaxN]; int cnt; int j; int x; for (x = son[i]; x != -1; x = brother[x]) { cnt = Deal(x, M - 1); for (j = M - 1; j > 0; j--) { for (k = 1; k <= cnt && k <= j; k++) { dp[i][j] = max(dp[i][j], dp[i][j - k] + dp[x][k]); } } ret += cnt; } for (k = M; k > 0; k--) { dp[i][k] = dp[i][k - 1] + value[i]; } return ret + 1; } int main() { int N, M; while (scanf("%d%d", &N, &M), N || M) { Init(); int i; int vv; int f; for (i = 1; i <= N; i++) { scanf("%d%d", &f, &vv); Insert(vv, f, i); } Deal(0, M + 1); printf("%d/n", dp[0][M + 1]); } return 0; }
HDU6354 Everything Has Changed 多校第五場 幾何題 愛德華是鋁循環機械的工人。他的工作是操作機械臂來切割設計模型。以下是他的工作簡介。 假設操作平面爲二維座標系。首先,有一個帶中心座標的圓盤(0 ,
數數 時間限制:3000 ms | 內存限制:65535 KB 難度:2 描述 我們平時數數都是喜歡從左向右數的,但是我們的小白同學最近聽說德國人數數和我們有些不同,他們正好和我們相反,是從右向左數的。因此當他看到123時
A problem is easy 時間限制:1000 ms | 內存限制:65535 KB 難度:3 描述 When Teddy was a child , he was always thinking about s
Bridging signals Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss
最少攔截系統 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 37
題面在這裏 題意: 問一個無向圖是否有歐拉路徑,並且有的話使得經過的點的權值異或和最大,輸出這個異或值。 做法: 首先判圖是否連通。 然後度爲奇數的點只能有0個或2個。 發現一個性質:(度+1)/2是奇數的點都是在路徑上的。
題目大意:給出一棵樹,每個點有一個點權,求對於每個i∈[0,m) 輸出有多少個連通誘導子圖的異或和爲i n≤1000 ,m<210 別問我爲什麼隔了這麼久突然跑回來更blog……我只是在填以前剩下的坑而已。。。 (我花了一整個
題目描述: 給出圖中一些點的連通關係,判斷任意圖中兩個點是否能從u到v或者v到u。 大致思路: 思路還是先用強連通縮點,之後對於這個圖進行拓撲排序,如果在排序過程中出現並列搜索的點了,也就是說這個子圖中有多個起點,也就是說一定存在(u,v
C++STL泛型編程 ANSI C++中包含了一個C++ STL(Standard Template Library),即C++標準模板庫,又稱C++泛型庫,它在std命名空間中定義了常 用的數據結構和算法,使用起來很方便。 STL提供三
http://codeforces.com/contest/196/problem/B B. Infinite Maze time limit per test 2 seconds memory limit per test
題意:給出一些城市的座標,每個信號基站可以覆蓋兩個相鄰的點,問最少要建多少個基站。 思路:我們要儘可能多的建立能覆蓋兩個城市的基站(二分匹配最大匹配),剩下的城市每個城市建立一個基站。先求出最大匹 配數k。n
題意:有N只奶牛,奶牛有自己認爲最受歡迎的奶牛。奶牛們的這種“認爲”是單向可傳遞的,當A認爲B最受歡迎(B不一定認爲A最受歡迎),且B認爲C最受歡迎時,A一定也認爲C最受歡迎。現在給出M對這樣的“認爲...”的關係,問有多少隻奶牛被除其本
題意:有n個人每個人可以把謠言傳給一些人,傳給每個人有一定的時間,求出你把謠言傳給誰,讓所有的人都知道的時間最短。 思路:枚舉每個點爲起點,到所有點的距離的最大值就是該點爲起點所消耗的時間,求出最小值就可以了,因爲給的n較小,直接
題意:給出n個卡車,每個卡車的類型是七個字符組成的,一種卡車可以從另一種卡車派生來的,代價是兩種卡車間類型不同字符的個數,求出這n中卡車派生的最小代價,n種車有一 種是開始就有的,n-1種是派生出來的。 思路:因爲剛開始有一種卡車,所以就
題意:給出n個字母的一些大小關係,判斷能否拓撲排序或者出現了矛盾,如果是這兩種情況要求出到第幾組關係時就可以得到。否 則就是所給數據不完全。 思路:每讀一組關係進行一次拓撲排序,如果排序成功或者出現矛盾記錄第幾組關係