题干在这里:https://www.luogu.org/problemnew/show/P1122
本题老师教了我两种方法,和大家分享一下,希望能帮到大家~~~
第一种思路:
由于每两个点之间都有一些联系,我们可以先把两两之间的关系用边的形式储存下来:
- head[x]是表示与x相连的第一个元素的下标
- edge[x].po是表示链头为x
- edge[x].next是表述链头是x,与x相连的元素的下标
- 运作方法:每读入一个数k,就将head[x]转变为k,之后再由edge数组转变下去,这样就将k与整个链连接起来了
动态规划总是要有状态转移方程的,我们用f[x]表示以x为根的最大价值数(其实就是题目中所谓的美丽指数,只不过这个名字太奇怪了。。。)。用g[x]表示以x为根,并且一定要取x的最大价值数
先考虑g[x]的状态转移方程:
value[x]+∑max(0,g[x]);
考虑f[x]是否取x:
如果不取,那么和他相连的子树都可以取,状态转移方程是(其中y具体取值请参看本人的代码):
max(f[y]);
而且一定要求两种情况的最大值!!!并且所有的f[x]d都要附一个足够小的数才行(本蒟蒻在这里卡了一个小时,望大家注意!!!)
当x是根的时候,需要用到它的子树列,用深搜就可以实现。深搜有两个参数:x表示处理的对象,fa表示该对象的父亲(之后是不能再回到fa的!!)
最后献上代码~~~
#include<iostream>
const int maxN=20000;
const int minvalue=-2147483647;
using