首页 > 其他分享 >蓝桥杯训练第二周

蓝桥杯训练第二周

时间:2024-05-10 16:11:07浏览次数:16  
标签:sz vector 训练 int 蓝桥 第二周 剪掉 节点 dp

P2015 二叉苹果树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

屮,一开始想当然的以为剪掉了其中一个边,其子树部分全部都会脱落,没想到剪掉一个边紧紧只是剪掉一个边,子树不会消失

很明显的,我们要考虑树形$dp$,因为剪掉哪条边是不确定的,那么暴力求的话,每条边都剪或不剪,时间复杂度为$O(2^n)$

如果我剪掉了这条边之后对后面的子树没有影响.所以具备无后效性,可以考虑树形$dp$或者是记忆化搜索

设方程 $dp[u][k]$ 为节点$u$保留$k$个节点的最大答案,那么明显的,我们设$u$此时保留了$i$个节点,其儿子$v$保留了$j$个节点,那么存在: $dp[u][i]=max(dp[u][i],dp[u][i-j-1]+dp[v][j]+w)$

为什么是$i-j-1$? 显然,我们从当前节点到儿子节点的这条边是不能删去的,不然的话没办法进行状态转移

接下来引入 - 背包

为什么是背包?我们直接把该题转化为:在当前节点$u$和其子树$v$的所有边中,选择几个边使得边权和最大,这不就是背包嘛?所以我们要倒序遍历

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10, mod = 1e9 + 7;
signed main()
{
    std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int n, k; cin >> n >> k;
    vector<int> sz(n + 1);
    vector<pair<int, int>> g[n + 1];
    vector<vector<int>> dp(n + 1, vector<int>(n + 1));
    for (int i = 1; i <= n - 1; i++)
    {
        int a, b, c; cin >> a >> b >> c;
        g[a].push_back({b, c}), g[b].push_back({a, c});
    }
    function<void(int, int)> dfs;
    dfs = [&](int u, int fa) -> void
    {
        sz[u] = 1;
        for (auto now : g[u])
        {
            int x = now.first, w = now.second;
            if (x == fa)
                continue;
            dfs(x, u);
            sz[u] += sz[x];
            for (int i = min(sz[u], k); i; i--)
            {
                for (int j = min(sz[x], i - 1); j >= 0; j--)
                {
                    dp[u][i] = max(dp[u][i], dp[u][i - j - 1] + dp[x][j] + w);
                }
            }
        }
    };
    dfs(1, -1);
    cout << dp[1][k] << '\n';
    return 0;
}

 

标签:sz,vector,训练,int,蓝桥,第二周,剪掉,节点,dp
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/18184695

相关文章

  • 代码随想录训练营第二天 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II
    977.有序数组的平方题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep暴力解时间复杂度O(nlogn)空间复杂度O(1)双指针法时间复......
  • 代码随想录算法训练营第第二天 | 977.有序数组的平方 、27. 移除元素
    977.有序数组的平方题目建议:本题关键在于理解双指针思想题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep/***@param{number[]}nu......
  • 蓝桥杯-地宫取宝
    X国王有一个地宫宝库,是n×m个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签。地宫的入口在左上角,出口在右下角。小明被带到地宫的入口,国王要求他只能向右或向下行走。走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿......
  • LLaMA-Factory 训练 Llama3-Chinese-8B-Instruct 相关报错问题解决
    模型路径up主为llama中文社区模型地址https://www.modelscope.cn/models/FlagAlpha/Llama3-Chinese-8B-Instruct/summarysysinfov10032gnvcc--versioncuda11.8pythonimporttorchprint(torch.version)13.11pipinstallflash_attntimeout2下载whl报这个错......
  • 代码随想录算法训练营第第一天 | 704. 二分查找 、27. 移除元素
    704、二分查找题目链接:https://leetcode.cn/problems/binary-search/文章讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715`varsearch=function(nums,target){letleft=0;letright=nums.length;letmi......
  • 代码随想录算法训练营第一天 | 704.二分查找 27.移除元素
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/文档讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715左闭右开时间复杂度O(logn)空间复杂度O(1)classSolution{public:intsearch(......
  • P10429 [蓝桥杯 2024 省 B] 拔河 题解
    思路通过动态规划计算出所有连续子序列的力量值之和,并将其存储在一个数组中然后排序,遍历一遍数组,找到相邻两个力量值之和的差的绝对值的最小值,然后输出这个答案就行了。时间复杂度大概是\(O(n^2\logn)\)。来个python的代码defmin_power_diff(n,a):#计算所有连续子序列......
  • YOLOv8 模型训练后验证
    验证代码:fromultralyticsimportYOLOpath="E:/resource/yolo8_all/ultralytics-main/"#训练后进行验证model=YOLO(path+"runs/detect/train11/weights/best.pt")metrics=model.val(data=path+"data_NEUDET.yaml")#自动评估训练的数据 参考链接......
  • 「高精度乘法+高精度加法」P10425 [蓝桥杯 2024 省 B] R 格式 题解
    解题思路题意分析:将浮点数乘以\(2^n\);四舍五入到最接近的整数。根据题意将\(d\times2^n\)分解为\(d\times2\times2\times2\times2……\),因为\(d\)长度小于等于\(1024\),所以可以使用高精度乘法的算法来实现一个小数乘以一个大于\(0\)的整数时,小数点位数本身不会......
  • Lora训练的参数和性能
    主要为了测试模型增加Lora模块后,参数量和训练速度的变化情况。结论:正常情况下,增加Lora模块是会增加参数量的,因此前向传播和反向传播的时间也会增加。但是,在大语言模型训练的情况下,因为基础模型本身参数量非常大,Lora模块增加的参数量相对非常小。并且,基础模型不参与梯度更新,可以做......