上一页 1 ··· 8 9 10 11 12 13 14 15 16 下一页
摘要: 尽管本题依旧是状压dp,但是不同的是本题的状态无法用二进制表示,而需要三进制。三进制特殊的地方在于位运算符全都不能用了,因此本题比往常的题目多了一部分,就是手写判断,而不是直接&,|,^. 可喜的是,本题状态定义极其简单,定义f[i][j]表示第i行的状态为j时,前i行的方案数,这样一来,本题与“国 阅读全文
posted @ 2019-04-13 20:31 AD_shl 阅读(277) 评论(0) 推荐(0) 编辑
摘要: 一道入门的状压dp题,很有意思也很简单。 定义f[i][j]表示第i行的状态为j时,前i行的方案总数,那么答案ans=∑f[n][j]. 考虑状态的转移,第i-1行的状态k能转移到第i行的j,当且仅当j&k==0且j,k分别符合他们自己放在那一行的条件,所以f[i][j]=∑f[i-1][k] (条 阅读全文
posted @ 2019-04-13 19:46 AD_shl 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 这是一道使用状压dp覆盖图形的问题,我们定义f[i][j][k]表示当第i行的状态为j,前i行一共k个国王时的方案数。其中,j表示将当前这一行状态压缩后对应的二进制数。状态转移方程为f[i][j][k]=∑f[i-1][x][num(x)].我们先预处理出每一个合法的状态,并记录他们用了多少国王,再 阅读全文
posted @ 2019-04-13 19:13 AD_shl 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 状压dp的一种经典模型,覆盖问题。 我们定义f[i][j]表示当第i行的状态为j时,前i行的方案数。显然答案为f[n][0]. 关于压缩状态,我们定义一个m位的二进制数,其中第i位为1的含义是,第i列是一个竖着的矩形的上半部分。第i位为0则表示其他情况。 因此,第i-1行的状态k能转移到第i行的状态 阅读全文
posted @ 2019-04-13 15:14 AD_shl 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 关于环形dp的处理,我采用的办法是,把整个问题分成两个问题。 首先我们简化一下问题,假设这个问题不是环形的,那么我们定义f[i][j][1]表示前i个小时休息了j小时,且第i小时正在休息,获得的体力最大值。定义f[i][j][0]表示前i个小时休息了j小时,且第i小时不在休息,获得的体力最大值。显然 阅读全文
posted @ 2019-04-13 14:16 AD_shl 阅读(406) 评论(0) 推荐(0) 编辑
摘要: 树形dp可能是最优美的dp了…… 这是一道经典的树上背包问题,考虑两种做法。第一种是直接在树上做一遍背包问题,另一种是把这棵树转化成“左儿子右兄弟”的二叉树,再做一遍背包问题。 方法一:我们定义f[i][j]表示以i为根的子树,一共选j门课最大的分数,那么我们可以得到f[i][j]=max(f[i] 阅读全文
posted @ 2019-04-13 12:42 AD_shl 阅读(401) 评论(0) 推荐(0) 编辑
摘要: 一道区间dp题,容易设计状态表示f[l][r]表示s[l~r]可能对应多少中金字塔方案数。 我们考虑在[l,r]中枚举一个k使得[l+1,k-1]作为l的一棵子树。那么s[l]应该等于s[k],状态转移方程为f[l][r]=∑f[l+1][k-1]*f[k][r]; 注意数据范围可能超过int,所以 阅读全文
posted @ 2019-04-07 13:48 AD_shl 阅读(303) 评论(0) 推荐(0) 编辑
摘要: 这道题当然可以用线段树求解,但是有点大材小用。我的做法是对顶堆,用两个堆维护中位数。 建立一个大根堆,一个小根堆。大根堆存储前半部分序列,小根堆存储后半部分序列,在任意时刻,这个序列的中位数为大根堆的堆顶或者是小根堆的堆顶。 如果现在新加入了一个数x,判断x应该在大根堆还是小根堆中,即判断排序后x在 阅读全文
posted @ 2019-04-07 12:20 AD_shl 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 一道区间dp题,不少细节。 一开始我想定义f[i][j]表示区间[i,j]通过某种合并之后的最大值,之后这道题就等同于“NOI1995石子合并”。 但是转念一想,这道题有加法和乘法两种运算,如果单看加法,以上思路正确。但是因为乘法的存在,两个较小的数(负数)相乘或许会大于两个最大数相乘,因此以上思路 阅读全文
posted @ 2019-04-07 11:52 AD_shl 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 区间动态规划的经典题,关于区间dp,状态定义是很显然的,定义f[i][j]表示把i~j这一区间合并花费的最小值,若i=j,则f[i][j]=0,若i≠j,则在i,j当中必定有一点k,使得i,j的区间先合并成i,k和k+1,j,然后合并成i,j.因此,对于每一对i,j,我们都枚举k,那么f[i][j] 阅读全文
posted @ 2019-04-07 10:40 AD_shl 阅读(279) 评论(0) 推荐(0) 编辑
上一页 1 ··· 8 9 10 11 12 13 14 15 16 下一页