随笔分类 -  动态规划

摘要:Problem Description Home 现在给你一个序列要求你将这个序列拆成恰好两个子序列。且使得两个子序列的抖动系数之和最大。 对于一个序列c1,c2,c3,……cm. 其抖动系数=|c1-c2|+|c2-c3|+……+|cm-1-cm| Problem Description Home 阅读全文
posted @ 2019-03-17 22:01 KirinSB 阅读(172) 评论(0) 推荐(0)
摘要:题意:1~100的格子,有n个传送阵,一个把进入i的人瞬间传送到tp[i](可能传送到前面,也可能是后面),已知传送阵终点不会有另一个传送阵,1和100都不会有传送阵。每次走都需要掷一次骰子(1~6且可能性一样),掷多少走多少,目的地超出100重掷,问你走到100所需掷骰子的期望。 思路:概率DP肯 阅读全文
posted @ 2019-03-15 21:11 KirinSB 阅读(150) 评论(0) 推荐(0)
摘要:题意1:问你一个串有几个不连续子序列(相同字母不同位置视为两个) 题意2:问你一个串有几种不连续子序列(相同字母不同位置视为一个,空串视为一个子序列) 思路1:由容斥可知当两个边界字母相同时 dp[i][j] = dp[i + 1][j] + dp[i][j - 1] - dp[i + 1][j - 阅读全文
posted @ 2019-03-10 16:15 KirinSB 阅读(218) 评论(0) 推荐(0)
摘要:题意:1~n每格都有金子,每次掷骰子,掷到多少走几步,拿走那格的金子,问你金子的期望 思路:dp[i]表示从i走到n金子的期望,因为每次最多走1<=x<=6步,所以dp[i] = a[i] + sum(1 / x * dp[j]) 代码: 阅读全文
posted @ 2019-03-09 13:54 KirinSB 阅读(235) 评论(0) 推荐(0)
摘要:题意:n个数字的串,每取出一个数字的代价为该数字和左右的乘积(1、n不能取),问最小代价 思路:dp[i][j]表示把i~j取到只剩 i、j 的最小代价。 代码: Multiplication Puzzle ZOJ - 1602 阅读全文
posted @ 2019-01-25 17:36 KirinSB 阅读(144) 评论(0) 推荐(0)
摘要:题意:问最多有几个括号匹配 思路:用dp[i][j]表示i到j最多匹配,若i和j构成匹配,那么dp[i][j] = dp[i + 1][j - 1] + 2,剩下情况dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]) 代码: 阅读全文
posted @ 2019-01-24 22:05 KirinSB 阅读(155) 评论(0) 推荐(0)
摘要:题意:合并石子,每次只能合并l~r堆成1堆,代价是新石堆石子个数,问最后能不能合成1堆,不能输出0,能输出最小代价 思路:dp[l][r][t]表示把l到r的石堆合并成t需要的最小代价。 当t == 1时,dp[i][j][1] = min(dp[i][j][1], dp[i][k][t] + dp 阅读全文
posted @ 2019-01-23 18:11 KirinSB 阅读(267) 评论(0) 推荐(0)
摘要:题意:有n个石堆排成环,每次能合并相邻的两堆石头变成新石堆,代价为新石堆石子数,问最少的总代价是多少 思路:先看没排成环之前怎么做:用dp[i][j]表示合并i到j所需的最小代价,那么dp[i][j]就是合并i~k、k+1~j的最小代价,即dp[i][j] = min(dp[i][j],dp[i][ 阅读全文
posted @ 2019-01-22 21:05 KirinSB 阅读(436) 评论(0) 推荐(0)
摘要:题意:给一个n*m的矩阵,你只能选择一个格子把这个格子的数换成p(也可以一个都不换),问最大子矩阵和最小可能是多少? 思路: 思路就是上面这个思路,这里简单讲一下怎么n^3求最大子矩阵和:枚举两行(或者两列),然后把每一列之和看做一个数字,这样二维就变成了一维,我们可以直接求最大子串和的方法。初始一 阅读全文
posted @ 2019-01-22 00:37 KirinSB 阅读(319) 评论(0) 推荐(0)
摘要:题意:有一种关系叫继承,那么继承父类的同时也会继承他的一个函数f,能继承任意多个父类或不继承,但不能继承自己的子类。现在规定一个列表,这个列表必须以1~N的顺序排列,并且父类不会排在子类后面,1含有一个函数f,有多少种可能使得这样一个列表每个数都继承f,取模1e9+7 思路:终于做出了一道DP(?) 阅读全文
posted @ 2019-01-06 23:22 KirinSB 阅读(215) 评论(0) 推荐(0)
摘要:题意:一串括号,每个括号代表一个值,当有相邻括号组成()时,可以交换他们两个并得到他们值的乘积,问你最大能得到多少 思路:DP题,注定想得掉头发。 显然一个左括号( 的最远交换距离由他右边的左括号的最终位置决定,那么我们可以从右边开始做。我们用dp[i][j]表示第i个左括号交换到第j个位置后,他和 阅读全文
posted @ 2018-12-15 17:27 KirinSB 阅读(376) 评论(1) 推荐(0)
摘要:题意:给一个16进制8位数,给定每个数字的贡献,问你贡献和。 思路:数位DP,想了很久用什么表示状态,看题解说用和就行,其他的都算是比较正常的数位DP。 代码: 阅读全文
posted @ 2018-11-08 23:01 KirinSB 阅读(200) 评论(0) 推荐(0)
摘要:链接:https://www.nowcoder.com/acm/contest/202/F来源:牛客网 题目描述 平衡二叉树,顾名思义就是一棵“平衡”的二叉树。在这道题中,“平衡”的定义为,对于树中任意一个节点,都满足左右子树的高度差不超过 d. 空树的高度定义为0,单个节点的高度为1,其他情况下树 阅读全文
posted @ 2018-10-02 20:01 KirinSB 阅读(374) 评论(0) 推荐(0)
摘要:题目链接 题意:有n个格子拉成一个环,给你k,你能使用任意个数的0 ~ 2^k - 1,规定操作 i XNOR j 为~(i ^ j),要求相邻的格子的元素的XNOR为正数,问你有几种排法,答案取模1e9 + 7。本题所使用的数字为无符号位数字。 思路:无符号位,所以异或取反后为正数,只可能是两个数 阅读全文
posted @ 2018-09-09 19:57 KirinSB 阅读(464) 评论(0) 推荐(0)
摘要:题意:有一棵n个点的树,点之间用无向边相连。现把这棵树对应一个序列,这个序列任意两点的距离为这两点在树上的距离,显然,这样的序列有n!个,加入这是第i个序列,那么这个序列所提供的贡献值为:第一个点到其他所有点距离之和。求所有序列贡献值之和。 思路:假如第一个点是k,那么后面n-1个点共有(n - 1 阅读全文
posted @ 2018-08-27 18:17 KirinSB 阅读(235) 评论(0) 推荐(0)
摘要:思路:若用dp[i][j]表示走到(i,j)的最大值,那么dp[i][j] = max(dp[i - 1][j],dp[i][j - 1],dp[i - 1][j - 1] + v),显然O(n^2)超时。但是我们可以优化这个dp,我们用f[j]表示第i行第j列当前最大值,那么f[j] = max( 阅读全文
posted @ 2018-08-27 10:28 KirinSB 阅读(184) 评论(0) 推荐(0)
摘要:思路: 数位dp的操作是dfs+记忆化,我们dp开四维:位置,长度,进制,是否回文。然后每次暴搜记录下每个位置的数字是什么,搜到对称轴另一边需要检查是否符合回文。 终于把友谊赛的题目都补完了...没做出来的都是学过的,做出来的都是没学过骚操作过的...学以不致用... 代码: 阅读全文
posted @ 2018-07-31 10:36 KirinSB 阅读(182) 评论(0) 推荐(0)
摘要:题意:给你汽车容积c1,c2,再给你n个包裹的体积,问你最少运几次能全运走 思路:用2进制表示每次运送时某物在不在此次运送之中,1在0不在。我们把运送次数抽象成物品价值,把状态抽象成体积,用一个dp[ i ] 记录完成状态i的最少步数那么就转化为了01背包问题,得到状态转移方程dp[ j|state 阅读全文
posted @ 2018-07-17 15:27 KirinSB 阅读(153) 评论(0) 推荐(0)
摘要:思路: 用状压DP+DFS遍历查找是否可行。假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去。dp[i][j]表示栈顶是i当前状态为j时能不能消去栈顶,-1代表不知道,0不行,1行。所以我们只 阅读全文
posted @ 2018-07-17 09:54 KirinSB 阅读(213) 评论(0) 推荐(0)
摘要:思路:和上一篇思路一样,但是这里要求最大能排几个,这里要开三维,记录上次和上上次的状态,再一一判定,状态转移方程为 dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k][t] + num[j]) 代码: 阅读全文
posted @ 2018-07-16 19:28 KirinSB 阅读(184) 评论(0) 推荐(0)