动态规划训练(1)题解

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=100312#overview


A  约瑟夫环问题,可以转化为递归问题,设该约瑟夫环跳跃间隔为K,那么在该情况下,F(n),为n个人中幸存的那个人我们来考虑,n+1与n之间的关系

令 n = 5, k = 3

1 2 3 4 5

1 2 4 5 *

4 5 1 2 * 

我们能够看到第三层与第二层之间的联系

于是得到F(n) = (F(n-1) + K - 1) % N


B 看到n很小,明显从区间动态规划的角度考虑

F(i,j,d) = MAX(F(i,k,1 - d) + sum(k + 1, j), F(k, j, 1 -d ) + sum(i, k -1))

k是从i 到 j 的枚举


对于每一个机器机器相邻的机器我们叫做Pi

那么我们就是要将Pi(i from 1 to n)尽量多的分组,使得他们的并为全集

然后在这个分组里面就可以摧毁一个服务,尽量多的分组,就是为了尽量多的摧毁服务

集合的表示和以用二进制来做,这个十分的经典

然后我们再来枚举分组的组合,用S来表示,COVER[S]就是表示这个分组的并

那么我们可以找到一个递推式

令F[S]表示以S分组的摧毁数,那么F[S] = MAX(F[S^S0],COVER[S0]为全集)+1,这里要想清楚为什么

因为S0是S的一个子集,当S0的并为全集的时候,就相当于在S0的补集上+1了,这样就清楚了


D 树形动态规划,注意状态的转移


E 其实很裸地一道动态规划,不过可以尝试着用单调队列进行优化,注意输出时两个答案之间空一格


F 和C题类似枚举子集,注意对状态数的减少,由于思考的特别巧就不多做解释了,做出来自会明白



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值