![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
——动态规划
NOI_yzk
我爱oi oi爱我
展开
-
多重背包二进制优化模板
多重背包的二进制优化沿袭了oi竞赛中的一个重要思想——二进制 即每个数都可以被多个不同的2^n相加得到然后就可以通过这样的处理方式将多重背包问题转变为01背包 复杂度由O(n*m)优化到O(n*logm)上模板FOR(i=1;i<=n;i++){ for(j=1;j<=A[i].num;j<<=1){ //分解为2^x //... A[i].原创 2017-09-23 20:04:00 · 402 阅读 · 0 评论 -
删除数字
这题也有很明显的线性关系,要求一串数字单调不递减 我们只需知道前面的那个数是否比自己大就好在预处理每个数的组成方案后,后面的就是线性dp了 枚举前一个数的方案,与后面一个数的方案 由于前面一个数的组成方案已经求出来了,可以使用前缀和+二分把这一维优化成logn 最后复杂度为n2lognn^2lognFOR(i,1,m) { FOR(j,1,Way[i]) {原创 2017-10-08 16:17:35 · 681 阅读 · 0 评论 -
完美队形(区间dp)
前言:感觉这是道神题,某神犇的代码只有300b+这题最难点在于状态的定义 可以很清楚地知道这应该是大区间转小区间 或者说是在一个范围内转移状态 但这个范围有不能枚举 而这题的正解优越性在于使用线性的遍历保证了区间的范围,使状态可以轻松地转移重点看for的顺序:#include<cstdio> #define FOR(i,x,y) for(int i=(x);i<=(y);i++) #defi原创 2017-10-08 19:39:58 · 464 阅读 · 0 评论 -
最大独立子集
题目描述 独立集是指两两不相邻的节点构成的集合。 求一棵树中,独立集的个数。(空集也算独立集) 输入 第一行一个整数n,表示树中节点的个数。 第二行n-1个数,表示每个节点父亲节点的编号。父节点的编号一定小于该节点。 输出 输出一个整数,表示独立集的个数,方案数较多,对1000000007取模。 这是道由2012年NOIP初赛问题求解第二道改编过来的题目 可以用树形dp的思想求解:原创 2017-10-02 19:48:36 · 1095 阅读 · 0 评论 -
先序遍历用于优化树形分组背包问题
转自 国家集训队 何森 论文【问题描述】 什么是树形背包?简单的说就是在一棵有N个节点的树上,每个节点都相当于一件物品,每件物品都有一个价格和一个得分对于物品a,设其父节点为father[a],那么你必须购买了father[a]后才能购买a。现给你M元现金,要求求一个购买方案,使得物品的总得分最大。 我们见过很多此类题目:重修道路、技能树、选课……【分析】 我们很容易想到一个树形动态规划转载 2017-10-04 20:53:37 · 530 阅读 · 0 评论