树形dp

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

从边长分段看不好入手

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

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

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

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

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

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

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <cmath>
  5. #include <algorithm>
  6. using namespace std;
  7. const int N = 205;
  8. int vec[N];
  9. struct Edge{
  10. int v, len, nxt;
  11. }edge[N];
  12. int cnt;
  13. int head[N];
  14. int dp[2][N][N];
  15. void addedge(int u, int v, int value) {
  16. edge[cnt] = Edge{ v,value,head[u] };
  17. head[u] = cnt++;
  18. edge[cnt] = Edge{ u,value,head[v] };
  19. head[v] = cnt++;
  20. }
  21. void dfs(int u,int p) {
  22. dp[0][u][vec[u]] = 0;
  23. dp[1][u][vec[u]] = 0;
  24. for (int t = head[u]; t != -1; t = edge[t].nxt) {
  25. Edge e = edge[t];
  26. if (e.v == p)
  27. continue;
  28. dfs(e.v, u);
  29. int v = e.v;
  30. for (int i = 200; i >= 0; i--)
  31. {
  32. for (int j = 0; j <= i; j++) {
  33. dp[0][u][i] = min(dp[0][u][i],dp[0][u][j] + dp[0][v][i-j]+2*e.len);
  34. }
  35. }
  36. }
  37. for (int t = head[u]; t != -1; t = edge[t].nxt) {
  38. Edge e = edge[t];
  39. int v = e.v;
  40. if (v == p)
  41. continue;
  42. int sum[N];
  43. for (int i = 0; i <= 202; i++)
  44. sum[i] = 1e9;
  45. sum[vec[u]] = 0;
  46. for (int t2 = head[u]; t2 != -1;t2=edge[t2].nxt) {
  47. Edge e2 = edge[t2];
  48. int v2 = e2.v;
  49. if (v2==p || v2 == v)
  50. continue;
  51. for (int i = 200; i >= 0; i--){
  52. for (int j = 0; j <= i; j++) {
  53. sum[i] = min(sum[i], sum[j] + dp[0][v2][i - j]+2*e2.len);
  54. }
  55. }
  56. }
  57. for (int i = 200; i >= 0; i--) {
  58. for (int j = 0; j <= i; j++) {
  59. dp[1][u][i] = min(dp[1][u][i], dp[1][v][j] + sum[i - j]+e.len);
  60. }
  61. }
  62. }
  63. }
  64. int main() {
  65. int n;
  66. cin >> n;
  67. cnt = 1;
  68. for (int i = 1; i <= n; i++) {
  69. cin >> vec[i];
  70. }
  71. memset(head, -1, sizeof head);
  72. for (int i = 0; i < 2; i++)
  73. for (int j = 0; j <= 200; j++)
  74. for (int k = 0; k <= 200; k++)
  75. dp[i][j][k] = 1e9;
  76. for (int i = 0; i < n - 1; i++) {
  77. int sv, ev, w;
  78. cin >> sv >> ev >> w;
  79. addedge(sv,ev,w);
  80. }
  81. dfs(1, 0);
  82. int m;
  83. cin >> m;
  84. while(m--){
  85. int x;
  86. cin >> x;
  87. for (int i = 200; i >=0; i--)
  88. if (dp[1][1][i] <= x)
  89. {
  90. printf("%d\n", i);
  91. break;
  92. }
  93. }
  94. return 0;
  95. }

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. 在android studio 中使用applicationid的问题

    现在我需要对项目app的某个功能做性能测试,主要测试耗电量的多少. 1.我想到的方式是,我需要在同一台手机测试,同一个应用,需要安装在手机两次,第二次安装不覆盖第一次的安装. 在android stu ...

  2. CodeForces 548

    A. Mike and Fax time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  3. 【原】iOS学习之控制器的创建

    本次博客是一篇总结性质的博客,总结的是各种创建控制器的方式以及一些需要注意的操作. 1.通过storyboard创建控制器 正如我上一篇博客中所说,当 Main Interface 没有选定的时候,我 ...

  4. Android -- 自定义控件(ImageButton)

    1. 效果图

  5. [IOS初学]ios 第一篇 storyboard 与viewcontroller的关系

    学习了一下ios,把一个基本的概念搞清楚了,在android或者wp中,大家基本都是习惯与一个画面场景代表一个类,新建场景的时候自动新建了类,但在ios中使用了storyboard之后发现,在stor ...

  6. UI设计中的48dp定律【转】

    有朋友建议我偶尔写写技术类的文章,所以我打算开始穿插性的写一些偏技术方面的科普文章,尽量往小白能看懂的方向写,今天我来讲讲UI设计中的48dp定律. 那么先说说什么是dp ?其实对于一个非技术人员要把 ...

  7. WPF整理-XAML构建后台类对象

    1.XAML 接触WPF的第一眼就是XAML---XAML是用来描绘界面的.其实不然! "Actually, XAML has nothing to do with UI. It's mer ...

  8. 野路子出身PowerShell 文件操作实用功能 MSSQL123

    因工作需要,处理一批文件,本想写C#来处理的,后来想想这个是PowerShell的天职, 索性就网上各种搜,各种Demo,各种修改,花了半天时间,最后还是拼凑出来能达到效果了. 本身对PowerShe ...

  9. 简单的行为控制管理方法,自动登录,session定时验证码过期

    代码很简单 实现的方式很多,用cookies 用static 变量 file文件缓存 等等 比如 //简单行为管理,如果请求此方法次数多于5次,就显示验证码 吧当前方法的name传进来,有效时间是5分 ...

  10. Java Basic Exception

    异常处理经验小结之一:不要直接抛出InvocationTargetException  (转http://olylakers.iteye.com/blog/1137371) 在最近一段时间的工作中,积 ...