又是一道树形DP的入门题,思想非常简单  然而我最开始还是存了两个状态[传送门]


题目描述

小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题。一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题。于是当日课后,小明就向老师提出了这个问题:

一株奇怪的花卉,上面共连有NN朵花,共有N-1N−1条枝干将花儿连在一起,并且未修剪时每朵花都不是孤立的。每朵花都有一个“美丽指数”,该数越大说明这朵花越漂亮,也有“美丽指数”为负数的,说明这朵花看着都让人恶心。所谓“修剪”,意为:去掉其中的一条枝条,这样一株花就成了两株,扔掉其中一株。经过一系列“修剪“之后,还剩下最后一株花(也可能是一朵)。老师的任务就是:通过一系列“修剪”(也可以什么“修剪”都不进行),使剩下的那株(那朵)花卉上所有花朵的“美丽指数”之和最大。

老师想了一会儿,给出了正解。小明见问题被轻易攻破,相当不爽,于是又拿来问你。

输入输出格式

输入格式:

第一行一个整数N(1 ≤ N ≤ 16000)N(1≤N≤16000)。表示原始的那株花卉上共NN朵花。

第二行有NN个整数,第II个整数表示第II朵花的美丽指数。

接下来N-1N−1行每行两个整数a,ba,b,表示存在一条连接第aa 朵花和第bb朵花的枝条。

输出格式:

一个数,表示一系列“修剪”之后所能得到的“美丽指数”之和的最大值。保证绝对值不超过21474836472147483647。

样例输入:

7
-1 -1 -1 1 1 1 0
1 4
2 5
3 6
4 7
5 7
6 7

样例输出:

3


如你所见这是一道背景略显智障非常好的题,我们来简化一下题目:

给定一个多叉树,每个点有一个权值。现在要做的就是保留或者不保留每个点,并且如果A是B和C的父节点,如果不保留A,那么B和C也不能保留。

那么我们需要求的就是最后能够保留的最大值。

于是最开始我是这么想的用f[u][0/1]来表示u节点的去留时所在子树的最大值,然后我弄完之后,因为智障而搞错了答案的存储,然后debug后突然想。。。既然0表示不选,那我为什么还要定义一个状态?????看来是我沙雕了。

那么既然定义出来了,就非常容易想到代码,代码如下:

 #include<bits/stdc++.h>
#define Add(X,Y) add((X),(Y)),add((Y),(X))
#define INF 1<<31
namespace Jason{
#define Xuxp(X,Y,Z) for(int (X)=(Y);(X)<=(Z);++i)
#define Xuxs(X,Y,Z) for(int (X)=(Y);(X)>=(Z);--i)
inline void scan(int &x){
int f=;x=;char s=getchar();
while(s<'' || s>''){if(s=='-') f=-;s=getchar();}
while(s>='' && s<=''){x=x*+s-'';s=getchar();}
x*=f;
}
inline void print(int x){
if(x<){putchar('-');x=-x;}
if(x>)print(x/);char s=x%+'';
putchar(s);
}
}
using namespace std;
using namespace Jason;
const int maxn=+;
//--------------------
struct Edge{
int to,nxt;
}edge[maxn<<];int cnt=,head[maxn];
int n,f[maxn];
//--------------------
inline void add(int x,int y)
{
edge[++cnt].nxt=head[x];
edge[cnt].to=y;
head[x]=cnt;
}
inline void dp(int u,int fa)
{
for(int i=head[u];i!=-;i=edge[i].nxt)
{
int v=edge[i].to;
if(v==fa) continue;
dp(v,u);
f[u]+=max(f[v],);
}
}
int main()
{
int a,b;
memset(head,-,sizeof(head));
scan(n);
Xuxp(i,,n) scan(f[i]);
Xuxp(i,,n-) scan(a),scan(b),Add(a,b);
dp(,);
int Max=-INF;
for(int i=;i<=n;++i) if(f[i]>Max) Max=f[i];
print(Max);
return ;
}

QAQ

【正在纠结买不买无限正义高达。。。。。。。】

最新文章

  1. Spring任务调度之Timer
  2. jquery层级原则器(匹配前一个元素后的下一个元素,必须是挨着的)
  3. OpenCV中对图像进行二值化的关键函数——cvThreshold()。
  4. SQL Server 查看死锁的存储过程(转载)
  5. FFMPEG-数据结构解释(AVCodecContext,AVStream,AVFormatContext)
  6. 利用IKVM在C#中调Java程序
  7. bzoj2658: [Zjoi2012]小蓝的好友(mrx)
  8. struts2的&lt;constant/&gt;标签使用
  9. Android 的独特shell命令
  10. HDU 5107 线段树扫描线
  11. DevExpress中GridView Excel下载
  12. MVC中用Jpaginate分页
  13. laravel数据库迁移的migrate小解
  14. SecureCRT 设置彩色和显示中文
  15. liunx 安装jdk1.8
  16. Confluence 6 修改警告的阈值和表现
  17. Ncurses - Panel
  18. 有关自动化构建gulp的搭建
  19. updateByPrimaryKeySelective更新失败
  20. STM32 LSM6DSL 陀螺仪数据采集

热门文章

  1. php自动载方法有两种.
  2. August 20th 2017 Week 34th Sunday
  3. Linux系统下常用的磁盘管理命令——du / df / fdisk / mount / xxd
  4. #npm install# MSBUILD : error MSB4132: 无法识别工具版本“2.0”。可用的工具版本为 &quot;4.0&quot;。
  5. chrome浏览器Network面板请求Timing分析
  6. MyBatis使用自定义TypeHandler转换类型的实现方法
  7. 【Vue】安装(NPM 方法)
  8. 【金融123】ISDA协议
  9. 2、Web Service-术语
  10. robotframework接口测试(二)—post request