【BZOJ4007】【JLOI2015】战争调度 war 搜索

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[vmurder]谢谢");
    puts("网址:blog.csdn.net/vmurder/article/details/45146301");
}

题解:

暴力是什么样呢? O(21023) 是也。
然后能过的算法是什么样呢?

首先对于一棵子树,如果根节点到整棵树的根节点这一部分节点的【挂机/送人头】的状态已经确定了,那么左子树的最优答案和右子树的最优答案就都是独立的,所以我们在这个时候就可以对左子树和右子树分别进行搜索。

然后 f(i,j) 表示节点 i 里有 j 个平民送人头 ※※ 且 i 的所有级父亲的【务农/参战】的状态已经确定的情况下 ※※ 的最优答案。

然后对于一个平民(就是一个叶子),因为是搜索,它的各级祖先的状态都确定,所以扫一遍 O(n) 就可以得到 f(i,0) f(i,1) 的答案。咳咳,这里的 n 就是那个输入的 n ,最大是 10 哦。

然后这样的话扫到一个第 i 层的点并枚举其状态的次数是 22i1,也就是 2i ,然后其处理方法是得到两个子树的状态后 O(2) 枚举俩子树都选了多少平民,然后发现左右子树各最多有 2ni 个平民,所以是 O(22n2i)

也就是说一个第i层的点需要的时间复杂度是 O(22n2i)
而第i层有 2i1 个点,每层的时间复杂度是 O(22n2)
然后有n层,最终时间复杂度 O((n1)22n2)

然后再算上每个平民扫 2n 次,每次 O(n1) 2n1 个平民,
最终时间复杂度 O((n1)22n) ,这个嘛 O(9220)

哎如果我算错了也没有关系嘛,反正我现场AC了。时间复杂度基本就是这么算的,差了也差不了多少。

代码:

程序还没发下来,以后再贴
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值