摘要: 很容易想到枚举第一步切掉的边,然后再计算能够产生的最大值。 联想到区间DP,令dp[i][l][r]为第一步切掉第i条边后从第i个顶点起区间[l,r]能够生成的最大值是多少。 但是状态不好转移,因为操作的符号不仅有‘+’,还有‘*’,加法的话,父区间的最大值显然可以从子区间的最大值相加得出。 乘法的 阅读全文
posted @ 2017-03-09 18:25 free-loop 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 很普通的DP,设dp[i][j][k]为第i块积木放在第j堆且摆放状态为k的最高高度。方程很容易推出。 # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> 阅读全文
posted @ 2017-03-09 17:08 free-loop 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 此题实质上是询问每段区间[l,r]内的数字能组成多少段连续的数字。 不大好用线段树合并区间来写。 考虑离线,类似于HH的项链的话,对询问按右端点排序,对于右端点的每一次右移,则对于询问,实际上是求的后缀区间。 如果前面已经出现了a[r]-1的话,那么它们能组成连续的区间,a[r]+1同理。 剩下的模 阅读全文
posted @ 2017-03-09 14:10 free-loop 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 对于树的一个括号序列,树上两点的距离就是在括号序列中两点之间的括号匹配完之后的括号数。。。 由此可以得出线段树的做法。。 #include<cstdio> #include<iostream> #define maxn 100000 #define inf (1<<25) using namespa 阅读全文
posted @ 2017-03-09 13:22 free-loop 阅读(308) 评论(0) 推荐(0) 编辑