树形dp

涉及不重复背包组合求最小

从边长分段看不好入手

因为点数只有100点值<=2,总值<=200

可以对每个点的每个值进行dp

这里最后不回来肯定优于全回来

然后由于要分为回来和不回来两种情况要分别dp,因为不回来会要用到回来的

不回来的可以按不回来的最小+去掉不回来那个子节点的回来的最小进行dp

另外注意下上下限和初始值

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 205;
int vec[N];
struct Edge{
int v, len, nxt;
}edge[N];
int cnt;
int head[N];
int dp[2][N][N];
void addedge(int u, int v, int value) {
edge[cnt] = Edge{ v,value,head[u] };
head[u] = cnt++;
edge[cnt] = Edge{ u,value,head[v] };
head[v] = cnt++;
}
void dfs(int u,int p) {
dp[0][u][vec[u]] = 0;
dp[1][u][vec[u]] = 0;
for (int t = head[u]; t != -1; t = edge[t].nxt) {
Edge e = edge[t];
if (e.v == p)
continue;
dfs(e.v, u); int v = e.v;
for (int i = 200; i >= 0; i--)
{
for (int j = 0; j <= i; j++) {
dp[0][u][i] = min(dp[0][u][i],dp[0][u][j] + dp[0][v][i-j]+2*e.len);
}
}
}
for (int t = head[u]; t != -1; t = edge[t].nxt) {
Edge e = edge[t];
int v = e.v;
if (v == p)
continue;
int sum[N];
for (int i = 0; i <= 202; i++)
sum[i] = 1e9;
sum[vec[u]] = 0;
for (int t2 = head[u]; t2 != -1;t2=edge[t2].nxt) {
Edge e2 = edge[t2];
int v2 = e2.v;
if (v2==p || v2 == v)
continue; for (int i = 200; i >= 0; i--){
for (int j = 0; j <= i; j++) {
sum[i] = min(sum[i], sum[j] + dp[0][v2][i - j]+2*e2.len);
}
}
}
for (int i = 200; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
dp[1][u][i] = min(dp[1][u][i], dp[1][v][j] + sum[i - j]+e.len);
}
}
}
}
int main() {
int n;
cin >> n;
cnt = 1;
for (int i = 1; i <= n; i++) {
cin >> vec[i];
}
memset(head, -1, sizeof head);
for (int i = 0; i < 2; i++)
for (int j = 0; j <= 200; j++)
for (int k = 0; k <= 200; k++)
dp[i][j][k] = 1e9; for (int i = 0; i < n - 1; i++) {
int sv, ev, w;
cin >> sv >> ev >> w;
addedge(sv,ev,w);
}
dfs(1, 0);
int m;
cin >> m;
while(m--){
int x;
cin >> x;
for (int i = 200; i >=0; i--)
if (dp[1][1][i] <= x)
{
printf("%d\n", i);
break;
}
}
return 0;
}

Hihocoder 1063 缩地的更多相关文章

  1. HihoCoder 1063 : 缩地 树形DP第二题(对象 边)

    时间限制:12000ms 单点时限:1000ms 内存限制:256MB 描述 编织者是 Dota 系列中的一个伪核,拥有很强的生存能力和线上消耗能力.编织者的代表性技能是缩地.缩地带来的隐身.极限移动 ...

  2. 树形DP专题

    DP是我的弱项, 此专题意在总结树形DP的解题思路. 最小代价遍历一棵树 给定一棵带边权的树 $T=(V,E)$ , 遍历它 (树的每个节点都访问至少一次) 所需的最小代价. 这里的代价由具体问题所定 ...

  3. hihocoder -1121-二分图的判定

    hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...

  4. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

  5. hihoCoder太阁最新面经算法竞赛15

    hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...

  6. 【hihoCoder 1454】【hiho挑战赛25】【坑】Rikka with Tree II

    http://hihocoder.com/problemset/problem/1454 调了好长时间,谜之WA... 等我以后学好dp再来看为什么吧,先弃坑(╯‵□′)╯︵┻━┻ #include& ...

  7. 【hihocoder#1413】Rikka with String 后缀自动机 + 差分

    搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...

  8. 【hihoCoder】1148:2月29日

    问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...

  9. 【hihoCoder】1288 : Font Size

    题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...

随机推荐

  1. What is a Database Trigger?

    Link: http://www.essentialsql.com/what-is-a-database-trigger/ Copy... What is a Database Trigger? A ...

  2. Linux UBI子系统设计初探

    问题领域 flash存储设备存在如下特点: 存在坏块 使用寿命较短 存储介质不稳定 读写速度慢 不支持随机访问(nand) 只能通过擦除将0改成1 最小读写单位为page or sub-page 便宜 ...

  3. 如何更好地学习dubbo源代码(转)

    很荣幸,作为这样一款业界使用率和好评率出众的RPC框架的维护者,今天这个文章主要是想帮助那些热爱开源的同学,更好的来研究dubbo的源代码. 一.Dubbo整体架构 1.Dubbo与Spring的整合 ...

  4. 【新手学Python】一、基础篇

    由于以前处理数据用Matlab和C,最近要处理大量文本文件,用C写实在是太繁琐,鉴于Python的强大文本处理能力,以及其在Deep Learning上有着很大优势,本人打算从即日起学习Python, ...

  5. java 打印流(PrintStream)

    打印流(PrintStream):打印流可以打印任意类型的数据,而且打印流在打印数据之前会将数据转为字符串在进行打印 PrintStream可以接受文件和其他字节输出流,所以打印流是对普通字节输出流的 ...

  6. python使用mysql数据库

    一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步进行操作即可. Linux 下的安装可能会更加简单,除了下载安装包进行安装外,一般的l ...

  7. 《实战Java虚拟机》,最简单的JVM入门书,京东活动,满200就减100了,该出手了

    #京东满200—100单# 图书放血大卖了 <实战Java虚拟机>http://item.jd.com/11670385.html 参加京东满200减 100的大促,就在6.1这一天,仅此 ...

  8. Codeforces Round #384 (Div. 2) E

    给出n个数字 1-8之间 要求选出来一个子序列 使里面1-8的数字个数 极差<=1 并且相同数字必须相邻(112 可以但是121不行)求这个子序列的最长长度 一道状压dp 看不懂别人的dp思想. ...

  9. adv钓鱼题

    4 10 4 5 6 2 10 2 10 4 5 6 2 10 2 60 1 20 29 20 50 20 60 1 20 20 20 60 20 #include<iostream> u ...

  10. 带你玩转JavaWeb开发之五-如何完成响应式开发页面

    响应式页面开发 使用BootStrap开发一个响应式的页面出来 响应式开发就是同一个页面在PC端与手机端Pad端显示不同的效果,以给用户更好的体验 需求分析 开发一套页面,让用户能够在PC端, Pad ...