第十三周周末总结+树状DP总结

     树状DP的专题结束了,感觉树状DP的知识点貌似没有什么可以总结的?每道题都要考虑dp状态转移方程。

    =。=,感觉每道题都要思考dp的条件,唯一不变的就是建树了,刚接触的时候建树都不会,然后看各种博客的时候有几种建树的方法,一个专题下来也都有些想法了,就来说   下建树方面吧,毕竟比赛的时候在写dp的时候可能想不到最优的方法,而建树的时候能够简单或者更符合自己想要的,就能给自己接下来建立优势。

  (1)二维数组建树:这是最简单的方法了,tree[1][2]就表示1与2连接,但是缺点也很明显,查找的时候要一个个循环,而且有很多用不着,时间浪费与空间浪费,而且稍微大一点就会超出数组大小上限,基本不用,除了特定情况以外。

  (2)vector建树    :用vector建树就好的多了,将每个连接的点添加到数组中,比如定义vector<int>tree[n],tree[1].push_back(5),就代表点1与5连接,如果还有边的权值的话,就设计个结构体存点与边的权值,然后定义vector<结构体>tree[n]就行了。不过每次清空的时候都要写一个循环来清空,所以这个我也不怎么用。

  (3)数组实现邻接表建树:用数组建立邻接表刚开始自己看博客的时候不是很会,其实看懂了很简单,而且我感觉也是最好用的一个,用数组建立邻接表需要先建立一个结构体数组tree[]以及数组head[],其中结构体中定义son、next、v,son表示当前连接的子节点,next代表下一个兄弟节点在数组tree中的坐标,v代表边的权值。 而head数组储存的是他输入的最后一个子节点在tree数组中的坐标。

 

***************插入边*******************
void build(int fa,int son,int v)
{
tree[p].v=son;
tree[p].val=v;
tree[p].next=head[fa];
head[fa]=p++;
}


*****************搜索********************
for(int i=head[now];i!=-1;i=tree[i].next)
 
 //初始化head数组的时候初始化为-1,所以
    当下一个兄弟坐标为-1的时候说明为第一
    个输入的兄弟坐标,所以搜索结束。



                   

  用数组实现邻接表感觉更为简单,清零也比较方便,我写树状数组的时候基本都是如此建树。

  

  树状dp的题感觉只要思路正确,找到状态转移方程,接下来就好写了,思路与状态转移方程就是核心了,搜索与设置条件以及建树每道题都基本一样了,不过变数很多,比如有的需要用二分确定条件等等。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值