DP Intro - Tree DP Examples

 

 

 

因为上次比赛sb地把一道树形dp当费用流做了,受了点刺激,用一天时间稍微搞一下树形DP,今后再好好搞一下)

基于背包原理的树形DP

poj 1947 Rebuilding Roads

题意:给你一棵树,让你求最少剪掉多少条边可以剪出一棵点数为m的子树.

解法:dp[i][j]表示i节点得到j个节点的子树至少要剪多少边,对于每个节点a和它的孩子b,如果剪掉b,则dp(s)[a][j]=dp(s-1)[a][j], 如果保留<a,b>dp(s)[a][j]=min{dp(s-1)[a][j - k] + dp[b][k]}.初始条件为dp[a][1] = 0;

为了不产生后效性,需要由大到小枚举j的值。ans=min{dp[i][m] + 1,dp[root][m]}

 

[java] view plaincopy
print?
  1. void dfs(int a) {  
  2.         dp[a][1] = 0;  
  3.         for (int i = E[a]; i != -1; i = buf[i].ne) {  
  4.             int b = buf[i].be;  
  5.             dfs(b);  
  6.             num[a]+=num[b];  
  7.             for (int j =Math.min(m,num[a]); j > 0; j--) {  
  8.                 dp[a][j]++;  
  9.                 for (int k = 1; k <= j&&k<=num[b]; k++)  
  10.                     dp[a][j] = Math.min(dp[a][j], dp[a][j - k] + dp[b][k]);  
  11.             }  
  12.         }  
  13.     }  
void dfs(int a) {dp[a][1] = 0;for (int i = E[a]; i != -1; i = buf[i].ne) {int b = buf[i].be;dfs(b);num[a]+=num[b];for (int j =Math.min(m,num[a]); j > 0; j--) {dp[a][j]++;for (int k = 1; k <= j&&k<=num[b]; k++)dp[a][j] = Math.min(dp[a][j], dp[a][j - k] + dp[b][k]);}}}

 

 

poj 1155 TELE 

题意:其余点为转发站。客户端i愿支付的钱为pay[i],每条边需要的花费固定,问电台在保证不亏损的情况下,解法:dp[a][j] = Math.max(dp[a][j], dp[a][j - k] + dp[b][k]- buf[i].v);节点a给j个节点输送信号能赚多少钱 j k num有N座城堡,每座城堡都有一定的宝物,允许攻克M个城堡并获得里面的宝物。但有些城堡必须先攻克其他某一个特定的城堡才能攻克,问攻克M个城堡所获得的最多宝物的数量。

dp[a][j] = Math.max(dp[a][j], dp[a][k] + dp[b][j - k]);dp[a][j]代表从i开始攻克j的城堡的最大获利,初始化时dp[i][1]=i城堡内的宝贝数,dp[0][1]=0;dp[i][0]=0;ans=Max{dp[i][m],dp[0][m+1]};

------------------------------------------------------------------------------------------------------

 

Poj 2486 Apple Tree

题意:苹果树上有n个节点,每个节点数上有若干个苹果,问最多走m步后至多能吃多少个苹果。

解法:每个在路径上的节点有两种形态:一是以此节点为起点到达某点后不再返回,而是从此节点出发后返回再从其它孩子继续走。因此定义dp[a][j][0]为a节点第一种情况下走j步的最大获利dp[a][j][1]为a节点在第二种情况下走j步的最大获利。转移方程为:

 

dp[a][j][0]=Math.max(dp[a][j][0],dp[a][k][1]+dp[b][j-k-1][0]); dp[a][j][0]=Math.max(dp[a][j][0],dp[a][k][0]+dp[b][j-k-2][1]); dp[a][j][1]=Math.max(dp[a][j][1],dp[a][k][1]+dp[b][j-k-2][1])

 

初始化dp[i][0][1]=dp[i][0][0]=i节点的苹果数。ans=Max{0,dp[1][i][0]};

 

Poj 1655 balancing Act/poj 3107 Godfather

题意:一个节点的平衡因子定义为:删到此节点后形成的节点数最多的子树。求一棵树中平衡因子最大的节点。

解法,定义num[i]为i节点为根的子树的节点数max[i]为i节点孩子节点数的最大值,一个节点的平衡因子=ans= Math.max(ans, first + second);

 

Sgu149&&HDU2196 Computer

解法:一个点的最远路径或者是向下一直走或者是先走到父节点然后再从父节点开始走一条较长的路径。
     对于第一种情况由底向上更新求出每点的最长路径和次长路径即可;对于第二种情况,如果当前节点是父节点最长路径上的点,那么向上的最长路径=边权+父节点的次长路径,否则最长路径=边权+父节点的最长路径。得到向上的最长路径后更新最长路径和次长路径(如果更新了最长路径,需要更新一下原来向下最大孩子的状态,使它不是父节点最长路径上的点),从上向下dfs更新一下即可。

[java] view plaincopy
print?
  1. int dfs(int a) {  
  2.         int temp, f = 0;  
  3.         for (int i = E[a]; i != -1; i = buf[i].ne) {  
  4.             int b = buf[i].be;  
  5.             temp = dfs(b) + buf[i].v;  
  6.             if (temp > first[a]) {  
  7.                 second[a] = first[a];  
  8.                 first[a] = temp;  
  9.                 f = b;  
  10.             }  
  11.             else if(temp>second[a])  
  12.                 second[a]=temp;  
  13.         }  
  14.         fid[a] = f;  
  15.         isf[f] = true;  
  16.         return first[a];  
  17.     }  
  18.   
  19.     void work(int p, int a, int v) {  
  20.         int temp = -1;  
  21.         if (isf[a])  
  22.             temp = second[p] + v;  
  23.         else  
  24.             temp = first[p] + v;  
  25.         if (temp > first[a]) {  
  26.             second[a] = first[a];  
  27.             first[a] = temp;  
  28.             isf[fid[a]] = false;  
  29.         } else if (temp > second[a])  
  30.             second[a] = temp;  
  31.           
  32.         for (int i = E[a]; i != -1; i = buf[i].ne) {  
  33.             int b = buf[i].be;  
  34.             work(a, b, buf[i].v);  
  35.         }  
  36.     }  
int dfs(int a) {int temp, f = 0;for (int i = E[a]; i != -1; i = buf[i].ne) {int b = buf[i].be;temp = dfs(b) + buf[i].v;if (temp > first[a]) {second[a] = first[a];first[a] = temp;f = b;}else if(temp>second[a])second[a]=temp;}fid[a] = f;isf[f] = true;return first[a];}void work(int p, int a, int v) {int temp = -1;if (isf[a])temp = second[p] + v;elsetemp = first[p] + v;if (temp > first[a]) {second[a] = first[a];first[a] = temp;isf[fid[a]] = false;} else if (temp > second[a])second[a] = temp;for (int i = E[a]; i != -1; i = buf[i].ne) {int b = buf[i].be;work(a, b, buf[i].v);}}

转载于:https://www.cnblogs.com/avcs/p/6909961.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强大的缓冲流

概述&#xff1a; 缓冲流的概述BufferedInputStream: 字节输入缓冲流BufferedOutputStream: 字节输出缓冲流四种方式复制字符缓冲流文本排序字符流读字符乱码问题InputStreamReader转换流读取字符数据OutputStreamWriter转换流写字符数据转换文件编码 1.缓冲流的概述&#xf…

linux驱动头文件查找目录,在Fedora 20中查找简单设备驱动程序的头文件

因此&#xff0c;我尝试按照简单的示例加载ORielly Linux设备驱动程序手册中的“ Hello World”设备驱动程序。问题是&#xff0c;由于某种原因&#xff0c;除非我在include语句中显式定义头文件的路径&#xff0c;否则它将无法正常工作。即我必须输入#include 而不只是#includ…

Feel Good

传送门 Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 14435 Accepted: 3996Case Time Limit: 1000MS Special JudgeDescription Bill is developing a new mathematical theory for human emotions. His recent investigations are dedicated to studying how g…

转换流/序列化/反序列化

转换流&#xff1a; 使用转换流可以在一定程度上避免乱码&#xff0c;还可以指定输入输出所使用的字符集 InputStreamReader&#xff1a;是从字节流到字符流的桥梁&#xff0c;父类是Reader OutputStreamWriter&#xff1a;是从字符流到字节流的桥梁&#xff0c;父类是Writer 转…

linux进程map,LInux环境运行mapReduce程序

将工程整体打成一个jar包并上传到linux机器上&#xff0c;准备好要处理的数据文件放到hdfs的指定目录中用命令启动jar包中的Jobsubmitter&#xff0c;让它去提交jar包给yarn来运行其中的mapreduce程序 &#xff1a;hadoop jar wc.jar cn.edu360.mr.wordcount.JobSubmitter ...…

python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)

预期框架整理目标&#xff1a; 1.单个用例维护在单个.py文件中可单个执行&#xff0c;也可批量生成组件批量执行 2.对定位参数&#xff0c;定位方法&#xff0c;业务功能脚本&#xff0c;用例脚本&#xff0c;用例批量执行脚本&#xff0c;常用常量进行分层独立&#xff0c;各自…

linux 不知道root密码怎么办,linux下忘记root密码怎么办

在linux系统操作中&#xff0c;为了系统的安全&#xff0c;会给系统中的root账户设置密码&#xff0c;那么忘记密码是时常发生的事情。如果忘记了root的密码该怎么办呢?下面秋天网 Qiutian.ZqNF.Com小编就给大家介绍下linux下忘记root密码的解决方法。linux是一套免费使用和自…

scrapy爬个小网站

本文使用scrapy对某一个网站静态数据进行了抓取# -*- coding: utf-8 -*- import scrapy from scrapy.http import request import requests import os import sys reload(sys) sys.setdefaultencoding(utf-8)#中文字符不能被识别报错 class spider(scrapy.Spider):namepicSpi…

linux如何标识用户账号和组账号,linux管理用户和组

唯一标识&#xff1a; UID GID (管理员root的UID为0)组的分类&#xff1a; 基本组 附加组(从属组)基本组&#xff1a;Linux自己创建的组&#xff0c;与用户同名&#xff0c;系统自动将用户加入附加组(从属组)&#xff1a;管理员自建创建&#xff0c;管理员将用户加入Linux一个…

Windows 相关链接

c运行库、c标准库、windows API的区别和联系 http://www.cnblogs.com/renyuan/p/5031100.html 转载于:https://www.cnblogs.com/jidongdeatao/p/6916260.html

vs远程编译linux程序,使用Visual Studio 2015远程调试Linux程序

##安装 Visual Studio 2015安装时注意将跨平台移动开发->Visual C移动开发->Viaual C Android 开发的选项勾上##安装PUTTYVisual Studio依赖putty中的plink来连接Linux机器并发送命令##使用首先在Visual Studio中新建一个空项目这里是列表文本接下来将代码导入到这个空项…

都在说反射,反射到底是什么

概念&#xff1a; 什么是反射? 利用反射可以无视修饰符获取类里面所有的属性和方法对于任何对象&#xff0c;都能够调用它的方法和属性&#xff0c;这种动态获取信息以及动态调用对象方法的功能称为Java的反射 反射的应用场景? 常见的有&#xff1a; idea的智能提示、框架等…

jade linux 安装教程,ROS-Jade版在UbuntuKylin15.04上的安装

ROS已经升级到Jade版了&#xff0c;而且貌似可以支持Ubuntu15.04。这里做一个测试&#xff0c;安装是成功的&#xff0c;运行有没有问题&#xff0c;慢慢用了再说。Ubuntu install of ROS JadeWe are building Debian packages for several Ubuntu platforms, listed below. …

LaunchScreen原理

会自动加载LaunchScreen是因为在Target当中,指定了Launch Screen file 它的底层实现其实把LaunchScreen上的东西,生成了一张图片,然后把这张图片设为程序的启动图片.可以进入沙盒当中查看,查看方法,找到应用程序根目录.获取方法: NSLog("%",NSHomeDirectory());打印出…

什么是注解,注解怎么用

概念&#xff1a; 什么是注解? 是JDK1.5推出的新特性 对程序进行标注和解释给类增加额外的信息注解可以保存一些简单的数据 注解和注释的区别 注释: 给程序员看的 注解: 给编译器看的 使用注解进行配置配置的优势 代码更加简洁,方便 注解也可以代替xml 注解的作用: 编写文档&…

QTimer在linux设置实时线程,为什么我的QTimer只能用于以QThread开头的线程消息,如果我的代码中没有QTimer?...

当(并且仅当)退出我的应用程序时,这些(并且仅这些)重复的消息出现在命令提示符上:QObject::startTimer: QTimer can only be used with threads started with QThreadQObject::startTimer: QTimer can only be used with threads started with QThreadQObject::startTimer: QTi…

一分钟看懂动态代理

动态代理&#xff1a; 在不改变目标对象方法的情况下对方法进行增强 组成部分&#xff1a; 被代理对象&#xff1a;真实的对象代理对象&#xff1a;内存中的一个对象 要求&#xff1a; 代理对象必须和被代理对象实现相同的接口 实现 使用Proxy.newProxyInstance() 举栗子&#…

linux 检查mps版本,linux_mps启动流程_存储相关.doc

linux_mps启动流程_存储相关Linux-mips启动流程-存储相关linux内核启动的第一个阶段是从 /arch/mips/kernel/head.s文件开始的。而此处正是内核入口函数kernel_entry(),该函数定义在 /arch/mips/kernel/head.s文件里。kernel_entry()函数是体系结构相关的汇编语言&#xff0c;它…

Mac - 苹果电脑mac系统释放硬盘空间方法汇总

硬盘空间是大家最头痛的一个问题&#xff0c;大家在硬盘空间变小的时候怎么腾空间的呢&#xff1f;下面为大家分享7个mac系统释放空间的高级方法&#xff0c;大家赶紧来收了&#xff01; mac系统释放硬盘空间方法&#xff1a; 方法一&#xff1a;删除Emacs——可以节省出60MB的…

XML语言

XML&#xff1a; XML是可扩展的标记语言 标记语言: 通过标签来描述数据的一门语言(标签有时我们也将其称之为元素) 可扩展&#xff1a;标签的名字是可以自定义的,XML文件是由很多标签组成的,而标签名是可以自定义的 xml学习网站https://www.w3school.com.cn/x.asp 作用&#xf…