http://codevs.cn/problem/1486/

我们比较熟悉二叉树,题目中给出的是一棵多叉树,我们需要将这可二叉树改造成二叉树。

二叉树可以为这样的:

父亲结点左边储存儿子,右边储存兄弟。

有两种改造方法:


if(tree[x].l==)tree[x].l=y;
else
{
int k=tree[x].l;
while(tree[k].r)k=tree[k].r;
tree[k].r=y;
}

tree[y].r = tree[x].l;
tree[x].l = y;

之后再考虑转移,对于这个题来说,我们想要得到关于父节点的信息,就必须先处理完它的左右子树。

注意对于每个节点,这个节点可以不取而直接去取它的兄弟。

先处理每个节点的兄弟,在每个节点枚举向左可以放多少人,向右可以放多少人,更新过程递归实现。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n,m;
int a[],dp[][];
struct ahah{
int l,r;
}tree[<<];
int dfs(int k,int sum)
{
if(!sum||!k)return ;
if(dp[k][sum]!=-)return dp[k][sum];
int ans=dfs(tree[k].r,sum);
for(int i=;i<sum;i++)
{
ans=max(ans,dfs(tree[k].l,i)+dfs(tree[k].r,sum-i-)+a[k]);
}
dp[k][sum]=ans;
return ans;
}
int main()
{
memset(dp,-,sizeof(dp));
int x,y;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(tree[x].l==)tree[x].l=y;
else
{
int k=tree[x].l;
while(tree[k].r)k=tree[k].r;
tree[k].r=y;
}
}
printf("%d",dfs(tree[].l,m));
}

[题解] codevs 1486 愚蠢的矿工的更多相关文章

  1. codevs1486愚蠢的矿工(树形dp)

    1486 愚蠢的矿工  时间限制: 1 s  空间限制: 128000 KB     题目描述 Description Stupid 家族得知在HYC家的后花园里的中央花坛处,向北走3步,向西走3步, ...

  2. RQNOJ:PID30 / [stupid]愚蠢的矿工☆(树形背包)

    PID30 / [stupid]愚蠢的矿工☆ 背景 Stupid 家族得知在HYC家的后花园里的中央花坛处,向北走3步,向西走3步,再向北走3步,向东走3步,再向北走6步,向东走3步,向南走12步,再 ...

  3. codevs愚蠢的矿工(树形DP)

    /* 树形DP 根节点一定有人 然后 剩下的人没到每个孩子去 因为孩子数可能很多 不好枚举 所以转二叉树 分两部分 O(sum)就可以了 当然 转二叉树候必须顾及原来树的一些性质 如不能只选左孩子 转 ...

  4. codevs——1503 愚蠢的宠物

    1503 愚蠢的宠物  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 大家都知道,sheep有两 ...

  5. [codevs 1503]愚蠢的宠物(特殊的LCA)

    题目:http://codevs.cn/problem/1503/ 分析:一道裸的LCA,但是由于询问只有一次,所以可以简单打打……可以从a,b向父节点推直到1节点,然后比较两个序列,后面一段肯定相同 ...

  6. rnqoj-30- [stupid]愚蠢的矿工-树形DP

    把树转化为二叉树,然后再左右DP: #include<stdio.h> #include<string.h> #include<iostream> #include ...

  7. RNQOJ [stupid]愚蠢的矿工(树形依赖背包)

    题意 题目链接 Sol 树形依赖背包板子题 树形依赖背包大概就是说:对于一个点,只有选了它的父亲才能选自身 把dfs序建出来,倒过来考虑 设\(f[i][j]\)表示从第\(i\)个节点往后背包体积为 ...

  8. CodeVS 1503 愚蠢的宠物

    题目描述 Description 大家都知道,sheep有两只可爱的宠物(一只叫神牛,一只叫神菜).有一天,sheep带着两只宠物到狗狗家时,这两只可爱的宠物竟然迷路了…… 狗狗的家因为常常遭到猫猫的 ...

  9. 树形DP习题

    听闻noip要考树形DP,本蒟蒻万分惶恐,特刷一坨题目,以慰受惊之心. codevs 1486 /*和非常出名的"选课"是一个题*/ #include<cstdio> ...

随机推荐

  1. Javascript中的回调函数和匿名函数的回调示例介绍

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 洛谷 - P1225 - 黑白棋游戏 - bfs

    神奇bug,没有记录pre就show了,找了1个小时. #include <bits/stdc++.h> using namespace std; #define ll long long ...

  3. [原]Windows下openssl的下载安装和使用

    安装openssl有两种方式,第一种直接下载安装包,装上就可运行:第二种可以自己下载源码,自己编译.下面对两种方式均进行详细描述. 一.下载和安装openss 方法一:直接使用openssl安装包 W ...

  4. 51nod1014【暴力】

    直接暴力1e6就好了 #include <bits/stdc++.h> using namespace std; typedef long long LL; int main() { LL ...

  5. 布线问题 最小生成树 prim + kruskal

    1 : 第一种 prime     首先确定一个点 作为已经确定的集合 , 然后以这个点为中心 , 向没有被收录的点 , 找最短距离( 到已经确定的点 ) , 找一个已知长度的最小长度的 边 加到 s ...

  6. Centos 6.8安装 SVN

    SVN SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subver ...

  7. DP HDOJ 5492 Find a path

    题目传送门 题意:从(1, 1)走到(n, m),每次往右或往下走,问(N+M−1)∑(Ai−Aavg)2 的最小值 分析:展开式子得到(N+M−1)∑(Ai2) - (∑(Ai))2的最小值.用普通 ...

  8. 贪心 HDOJ 5090 Game with Pearls

    题目传送门 /* 题意:给n, k,然后允许给某一个数加上k的正整数倍,当然可以不加, 问你是否可以把这n个数变成1,2,3,...,n, 可以就输出Jerry, 否则输出Tom. 贪心:保存可能变成 ...

  9. Linux 导出Okular 编辑的pdf批注

    1.环境 ubuntu 14.04 LTS Okular Version 0.19.3 Using KDE Development Platform 4.13.3 2.方法 2.1只导出批注,不改变p ...

  10. Suricata的初始化脚本

    见官网 https://suricata.readthedocs.io/en/latest/initscripts.html