首页 > 其他分享 >洛谷-P2015 二叉苹果树

洛谷-P2015 二叉苹果树

时间:2022-11-01 21:01:20浏览次数:72  
标签:洛谷 int P2015 ll 二叉 nex gra include dp

二叉苹果树

树形dp

设计状态:\(dp[u][i]\),表示以结点 \(u\) 为根的子树,保留 \(i\) 条边的最大苹果数

状态转移:遍历每一个子节点 \(v\)

  • 保留和 \(v\) 相连的边:\(dp[u][i] = dp[u][i - j - 1] + dp[v][j] + w_{uv}\)

\(j\) 为遍历 \([0, Q - 1]\) 表示以 \(v\) 为根的子树中保留了 \(j\) 条边,显然 \(j\) 不能等于 \(Q\),因为还有一条边是 \(u\) 到 \(v\)

\(i\) 为当前子树总共保留 \(i\) 条边,遍历 \([0, Q]\)

\(w_{uv}\) 表示 \(u\) 和 \(v\) 相连的边上有多少个苹果

  • 不保留和 \(v\) 相连的边:\(dp[u][i] = dp[u][i]\)

综上,状态转移为:\(dp[u][i] = max(dp[u][i], dp[u][i - j - 1] + dp[v][j] + w_{uv})\)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
const ll maxn = 110;
const ll inf = 1e17 + 10;
vector<vector<array<int, 2>>>gra;
int n, q;
int dp[maxn][maxn];

void dps(int now, int pre)
{
    for(auto [nex, val] : gra[now])
    {
        if(nex == pre) continue;
        dps(nex, now);
        for(int i=q; i>=1; i--)
            for(int j=0; j<i; j++)
                dp[now][i] = max(dp[now][i], dp[now][i - j - 1] + dp[nex][j] + val);
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> q;
    gra.resize(n + 1);
    for(int i=1; i<n; i++)
    {
        int a, b, k;
        cin >> a >> b >> k;
        gra[a].push_back({b, k});
        gra[b].push_back({a, k});
    }
    dps(1, 1);
    cout << dp[1][q] << endl;
    return 0;
}

标签:洛谷,int,P2015,ll,二叉,nex,gra,include,dp
From: https://www.cnblogs.com/dgsvygd/p/16849135.html

相关文章

  • 二叉树
      平衡二叉树,高度差,不能超过1,如果有差别,只能差1.要维持平衡二叉树。 二叉树进化二叉查找树进化平衡二叉树 注意,如果一样,就不存。......
  • 洛谷-P1122 最大子树和
    最大子树和树形dp对于一个节点来说,如果删除掉一个连接子节点的边,则以该子节点为根的子树上面的贡献都会变成\(0\)设计状态:\(dp[u]\),表示以\(u\)为根的子树中,贡献值最......
  • 洛谷 P3183 [HAOI2016]食物链(dfs+记忆化搜索)
    https://www.luogu.com.cn/problem/P3183题目大意:给定n个节点,标号分别为1——n,然后给出m条有向边,问我们不同的食物链路径有多少?输入#1101612141102325......
  • 洛谷P1144
    最短路计数题目描述给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1\simN\)。问从顶点\(1\)开始,到其他每个点的最短路有几条。输入格式第一行包含\(2......
  • 洛谷 P6573 [BalticOI 2017] Toll 题解
    Link算是回归OI后第一道自己写的题(考CSP的时候可没回归)写篇题解纪念一下题目大意:\(n\)个点,\(m\)条单向边,每条边的两端点\(x\),\(y\)必定满足\(\left\lfloor\dfrac......
  • 洛谷P1462spfa + 二分答案
    第一次接触二分答案的题目最开始是没有思路的看了一个题解,然后强行理解之后开始自己打了一遍,然而结果是只得了30分过了3个点其他全wa,之后是漫长的debug,这里想感慨一句自己d......
  • Arrays方法之binarySearch():二叉搜索算法搜索指定的int数组的指定值
    以下直接抄写释义:publicstatic int binarySearch(int[] a,int key)使用二叉搜索算法搜索指定的int数组的指定值。 在进行此调用之前,必须对数组进行排序(如sort(int[......
  • leetcode111-二叉树的最小深度
    111.二叉树的最小深度 这道题相比 104.二叉树的最大深度 还是难上一些的,但也不算太难。BFS/***Definitionforabinarytreenode.*structTreeNode{......
  • 代码随想录训练营第二十一天 | 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236
     今天是第二十一天,还是二叉树,做了得有一周的二叉树了530.二叉搜索树的最小绝对差 classSolution{intres=Integer.MAX_VALUE;TreeNodepre=null;......
  • LeetCode 236. 二叉树的最近公共祖先 - 回溯的理解
    题目https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/思路自己做只摸到一些门道,还是靠随想录...代码:deflowestCommonAncestor(self,root:'......