乍一看好像挺简单的想都没想就开始建图...
直接忽略这是棵树...
然后做着做着就卡了
最后还是看了题解
不过真的挺简单的...人蠢嘛没办法
注意的地方大概就是dp特判和tree初始化不能为0吧
题目描述
输入格式
输出格式
样例
数据范围与提示
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int MAXN = 1e7 + 5 ; 5 6 int n , m , a , b , c ; 7 int left_son[105] , right_son[105] , apple[105] ; 8 int tree[105][105] , f[105][105] ; 9 10 int read(){ 11 char c ; 12 int sign = 1 ; 13 while((c = getchar()) < '0' || c > '9') 14 if(c == '-') sign = -1 ; 15 int Ans = c - '0' ; 16 while((c = getchar()) >= '0' && c <= '9') 17 Ans = Ans * 10 + c - '0' ; 18 return Ans * sign ; 19 } 20 21 void plant_tree(int a){ 22 for(int i = 1 ; i <= n ; ++ i) 23 if(tree[a][i] >= 0){ 24 left_son[a] = i ; 25 apple[i] = tree[a][i] ; 26 tree[a][i] = tree[i][a] = -1 ; 27 plant_tree(i) ; 28 break ; 29 } 30 for(int i = 1 ; i <= n ; ++ i) 31 if(tree[a][i] >= 0){ 32 right_son[a] = i ; 33 apple[i] = tree[a][i] ; 34 tree[a][i] = tree[i][a] = -1 ; 35 plant_tree(i) ; 36 break ; 37 } 38 } 39 40 int DP(int a , int k){ 41 if(k == 0) return 0 ; 42 if(left_son[a] == 0 && right_son[a] == 0) return apple[a] ;//理解f[a][k]是一定要取a这个点的 43 if(f[a][k]) return f[a][k] ; 44 for(int i = 0 ; i <= k - 1 ; ++ i){//最多只能到k-1 45 f[a][k] = max(f[a][k] , DP(left_son[a] , i) + DP(right_son[a] , k - i - 1) + apple[a]) ; 46 } 47 return f[a][k] ; 48 } 49 50 int main(){ 51 n = read() , m = read() ; 52 ++ m ; 53 for(int i = 1 ; i <= n ; ++ i){ 54 for(int j = 1 ; j <= n ; ++ j){ 55 tree[i][j] = -1 ; 56 } 57 } 58 for(int i = 1 ; i <= n - 1 ; ++ i){ 59 a = read() , b = read() , c = read() ; 60 tree[a][b] = tree[b][a] = c ;//双向边 61 } 62 plant_tree(1) ; 63 cout << DP(1 , m) ; 64 return 0 ; 65 }