首页 > 其他分享 >动态规划总结

动态规划总结

时间:2022-11-16 17:11:06浏览次数:41  
标签:总结 cnt int dfs son 权值 动态 规划 View

树形DP

一、在u的子树中,选择一个大小恰好为m的包含u点的连通块,最大的权值和(u,m<=2e3)

这样写虽然是三重循环但是时间复杂度是O(nm)的  

 

void dfs(int u) {
    sz[u] = 0;
    for (int v : son[u]) {
        dfs(v);
        
        for (int i = 0; i <= sz[u] + sz[v]; i ++) temp[i] = -INF;
        for (int i = 0; i <= sz[u]; i ++)
            for (int j = 0; j <= sz[v]; j ++)
                temp[i + j] = max(temp[i + j], dp[u][i] + dp[v][j]);
        
        for (int i = 0; i <= sz[u] + sz[v]; i ++) dp[u][i] = temp[i];
        sz[u] += sz[v];
    }
    sz[u] ++;
    for (int i = sz[u]; i; i --) dp[u][i] = dp[u][i - 1] + w[u];
}
View Code

 

二、题意跟上题一样但是n<=50000,m<=100

这样的话其实时间复杂度是O(nm)的

sz[u] = 0;
    for (int v : son[u]) {
        dfs(v);
        
        for (int i = 0; i <= min(sz[u] + sz[v], M); i ++) temp[i] = -INF;
        for (int i = 0; i <= min(sz[u], M); i ++)
            for (int j = 0; j <= sz[v] && i + j <= M; j ++)
                temp[i + j] = max(temp[i + j], dp[u][i] + dp[v][j]);
        
        for (int i = 0; i <= min(sz[u] + sz[v], M); i ++) dp[u][i] = temp[i];
        sz[u] += sz[v];
    }
    sz[u] ++;
    for (int i = min(sz[u], M); i; i --) dp[u][i] = dp[u][i - 1] + w[u];
View Code

三、每个点都有权值和重量,求一个重量恰好为k的包含根的连通块,最大的权值和(n<=1e3,m<=1e4),不存在输出0

特殊技巧:按dfs序做,r(x)表示序列中跳过x的子树的下一个位置,f[i][j]表示dfs序中 [i, n] 这一段的节点重量等于j的最大权值

f[i][j] = max(f[r(i)][j](不选), f[i + 1][j - vi] + wi),若不选这个节点则子树都跳过

 

void dfs(int u) {//dfs序
    l[u] = cnt ++;
    id[cnt] = u;
    for (auto v : son[u]) dfs(v);
    r[u] = cnt;
}

void solve() {
    for (int i = 1; i <= m; i ++) dp[n + 1][i] = -INF;
    for (int i = n; i; i --) {
        int u = id[i];
        for (int j = 0; j <= m; j ++) {
            dp[i][j] = dp[r[u] + 1][j];
            if (j >= v[u]) dp[i][j] = max(dp[i][j], dp[i + 1][j - v[u]] + w[u]);
        }
    }
}
View Code

 

标签:总结,cnt,int,dfs,son,权值,动态,规划,View
From: https://www.cnblogs.com/Leocsse/p/16896573.html

相关文章

  • mvc视图类中向Js传递动态参数
     使用APS.NET MVC编写页面,在Html中为javascript函数传入的参数为动态数据时,要注意将动态参数放在引号中,如下面代码中@item.FeeDeptName。@foreach(variteminModel......
  • 【前端面试】Vue面试题总结(持续更新中)
    由于已经有很多前辈深造VUE的某一块知识,所以我也是大树下好乘凉,进行总结与积累。就有这篇博客,希望对各位面试求职的同学有所帮助。注意:每题都附上链接并不是说要参考这个链......
  • mybatis Sql动态问题集合
    where和if搭配: where其实就是表示sql语句中where的用法;where包围后,就不用在sql语句中加where了; if语句的语法结构:<iftest=""></if>其中的test就是判断......
  • Vue3的setup在el-tab中动态加载组件
    公司某项目需求在页面显示的组件是根据角色变化而变化的,在这个项目中我使用了elementplus的el-tabs来动态的显示这些组件,如下图所示数据内容大概是这样的在未使用setup......
  • 经典CNN设计演变的关键总结:从VGGNet到EfficientNet
    卷积神经网络设计史上的主要里程碑:模块化、多路径、因式分解、压缩、可扩展一般来说,分类问题是计算机视觉模型的基础,它可以延申解决更复杂的视觉问题,例如:目标检测的任务包......
  • 动态规划详解
    <spanstyle="font-family:Tahoma;background-color:rgb(255,255,255);">其实根本就谈不上详解,应该说只是随便谈谈,真正能详解动态规划的又有几个人,所以,这个标题......
  • RuoYi 若依框架 使用总结
    环境JDK>=1.8(推荐1.8版本)Mysql>=5.7.0(推荐5.7版本)Redis>=3.0Maven>=3.0Node>=12下载完成记得配置环境变量。导入项目下载项目直接在:https://git......
  • 121. 买卖股票的最佳时机 ----- 动态规划、历史最小一次遍历
    给定一个数组prices,它的第 i个元素 prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计......
  • 【code】动态规划
    了解动态规划动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等......
  • SpringBoot 11: Spring + SpringMVC + SpringBoot常用注解总结
    创建对象的:@Controller: 放在类的上面,创建控制器对象,注入到容器中@RestController: 放在类的上面,创建控制器对象,注入到容器中作用:是@Controller@ResponseBody......