摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1423 4、LICS、O(lena * lenb) 设dp[i][j]表示a[]的前i项,以b[]的第j项结尾时,能匹配的最大值。 ①、不匹配a[i]这个数,则是dp[i][j] = dp[i – 1][j]; ②
阅读全文
摘要:http://poj.org/problem?id=1692 这题看完题后就觉得我肯定不会的了,但是题解却很好理解。- - ,做题阴影吗 所以我还是需要多思考。 题目是给定两个数组,要求找出最大匹配数量。 匹配规则是: a[i] ==b[j],而且需要产生交叉,而且没对数只能匹配一次。 一开始的时候
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=5808 用bitset<120>dp,表示dp[0] = true,表示0出现过,dp[100] = true表示100这个数字出现过。 对于每一个新的数字,val,有转移方程, dp = dp | (dp <<
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2457 首先把病毒串保存一下,然后对于每一个trie上的节点,跑一发AC自动机,建立一个trie图。 建立的时候,对应做一些修改。 比如,现在建立成了这个样子。 如果he是一个病毒串,那么应该相对应的,把she那个
阅读全文
摘要:http://poj.org/problem?id=2955 区间dp的写法还是dfs的好写。 设dp[i][j]表示[i, j]这个区间的合法情况的最大值。 然后想要求[i, j]合法情况的最大值,有两种。 1、如果i和j的搭配的括号,那么dp[i][j] = dp[i + 1][j - 1] +
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2604 这题居然O(9 * L)的dp过不了,TLE, 更重要的是找出规律后,O(n)递推也过不了,TLE,一定要矩阵快速幂。然后立马GG. 用2代表m,1代表f。设dp[i][j][k]表示,在第i位,上一位站了
阅读全文
摘要:http://acm.uestc.edu.cn/#/problem/show/878 设dp[i][j][k]表示在前i个数中,第一个得到的异或值是j,第二个人得到的异或值是k的方案数有多少种。 因为异或后的大小不确定,所以不能压缩数组,但是也不大。。可以过。 #include <cstdio> #
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2196 要统计第8号顶点的答案,那么可以来源于2部分。 1、8直接走下面的子树,这样就可能是最长距离。 2、8借助它的爸爸2,走了2能走的最长距离(这个不能经过8本身) + e[2][8] 然后递归处理,2也是这样
阅读全文
摘要:http://poj.org/problem?id=2342 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的活跃指数和上司关系(当然不可能存在环),求邀请哪些人(多少人)来能使得晚会的总活跃指数最大。 对于每一个人,都有两种情
阅读全文
摘要:http://codeforces.com/contest/768/problem/C 这题的数值大小只有1000,那么可以联想到,用数值做数组的下标,就是类似于计数排序那样子。。 这样就可以枚举k次操作,然后for (int i = 0; i <= 1025; ++i),也就是O(1000 * k
阅读全文
摘要:http://codeforces.com/gym/101257/problem/C 询问从左上角走到右下角,每次只能向右或者向左,捡起三种物品算作一个logo,求最多能得到多少个logo。 设dp[i][j][k][h]表示走到(i, j)这个格子,然后得到的第一种物品是k,第二种物品是h的时候,
阅读全文
摘要:https://vijos.org/p/1426 这是个好题,容易想到用dp[i][v1][v2][v3][v4][v5]表示在前i个物品中,各种东西的容量是那个的时候,能产生的最大价值。 时间不会TLE,但是会MLE.所以就需要把那5维状态进行hash 其实就是对这个排列进行一个hash。 new
阅读全文
摘要:https://vijos.org/p/1412 把dp设成,dp[i][v][k]表示在前i项中,拥有v这个背包,的第k大解是什么。 那么dp[i][v][1...k]就是在dp[i - 1][v][1...k]和dp[i - 1][v - w[i]][1...k] + val[i]中合并得来。
阅读全文
摘要:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1475 这题转化过来就是,给定n个点,每个点都有一个过期时间,一个价值。现在安排他们成一直线,使得总和最大。 一开始就是贪心,这是一个很经典的贪心。 http://www.c
阅读全文
摘要:http://codeforces.com/contest/766/problem/C 关键在于dp,如何计数。 设dp[i]表示前i个字母中,能分成多少份合法的情况。那么答案就是dp[n],其中dp[0] = 1; 比如说:aab的,也就是样例。 对于每一个i,枚举其往后能组合成那个,比如b,能组
阅读全文
摘要:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1272 离散化后,用dp[i]表示向右,大于等于i这个数字的最大位置 dp[i] = max(dp[i + 1], dp[i]) #include <cstdio> #inc
阅读全文
摘要:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270&judgeId=194704 一开始贪心,以为就两种情况,大、小、大、小.....这样下去 小、大、小、大、....这样下去, 结果翻车。比如1、2、1、1、2、1这
阅读全文
摘要:http://codeforces.com/contest/761/problem/C 对于每一个字符串,可以预处理出其到达数字,字母,和特殊符号所需的最小步数。 然后就是在n个东西中,选出数字、字母和特殊符号,至少一个,所需的最少步数。 因为第一个选了数字的话,它就不能选字母的了,然后比赛的时候发
阅读全文
摘要:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1268&judgeId=193772 给出n = 20个数,问其是否有和为k的情况 分两段,用O(2^(n / 2))复杂度维护出每一段的所有情况。 然后枚举第一段,二分判断
阅读全文
摘要:https://www.hackerrank.com/contests/w28/challenges/lucky-number-eight 设dp[i][v]表示前i位数中,得到余数是v的子序列的数目。 那么产生新的状态就是,对于每一个上一次的余数v。新的余数数目就有,(v * 10 + str[i
阅读全文