动态规划训练(1)题解
2015-11-23 20:28
197 查看
题目链接: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 的枚举
C
对于每一个机器机器相邻的机器我们叫做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题类似枚举子集,注意对状态数的减少,由于思考的特别巧就不多做解释了,做出来自会明白
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 的枚举
C
对于每一个机器机器相邻的机器我们叫做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题类似枚举子集,注意对状态数的减少,由于思考的特别巧就不多做解释了,做出来自会明白
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- 背包问题
- USACO 3.2.2:Stringsobits
- 字符串编辑距离
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)