
acwing
文章平均质量分 60
心意310
亘古一片月。
展开
-
【题解】蒙德里安的梦想
很经典的状态压缩dp,不过y总的编译器可能有点问题,相同的代码第一遍超时,再提交居然A了,很离谱…求把 N×M 的棋盘分割成若干个 1×2 的长方形,有多少种方案。例如当 N=2,M=4 时,共有 5 种方案。当 N=2,M=3 时,共有 3 种方案。如下图所示:输入包含多组测试用例。每组测试用例占一行,包含两个整数 N 和 M。当输入用例 N=0,M=0 时,表示输入终止,且该用例无需处理。每个测试用例输出一个结果,每个结果占一行。1≤N,M≤11...原创 2022-07-05 09:28:04 · 898 阅读 · 0 评论 -
【题解】最短编辑距离
将n个字符的字符串a改成m个字符的字符串b最少需要几步, 每次操作有三种选择: 删除a的一个字符, 增加a的一个字符, 修改a的一个字符.怎么入手?判断a和b的长度增删到一直后逐个判断a和b的字符是否相同然后依次修改a吗?两个问题:1.如何保证最终答案一定是最小值. 子问题就是如何保证每次插入或者删除的时候都是最优解?2.代码及其繁琐, 且必然会超时.动态规划优化:用数组f[i] [j]表示将a的前i个字符和b的前j个字符匹配所需的最小操作数.我们考虑最后一步操作(假设前面都已经操作完, 第一步原创 2022-06-18 21:15:42 · 287 阅读 · 0 评论 -
【题解】最长上升子序列+记录路径+优化版本
给定数列,找到最长子序列。动态规划。数组a[N]存数列。状态表示:f[i]表示以a[i]结尾的上升子序列的集合中长度的最大值。状态转移方程:f[i]=max(f[i],f[j]+1);f[i]=max(f[i],f[j]+1);f[i]=max(f[i],f[j]+1);因为f[i]表示以a[i]结尾,既然序列一定包含a[i],那么我们不妨先看前i-1个数中的子序列集合中,有多少能和a[i]匹配,然后找到所能匹配的集合中的最大值。为什么可以保证g[N]中存的一定是最长子序列的路径?关键在if(f[i原创 2022-06-01 21:14:29 · 474 阅读 · 0 评论 -
【题解】二进制优化的多重背包问题
题目: https://www.acwing.com/problem/content/5/题意: 裸多重背包,但是题目数据范围较大。三重循环纯朴素解法会超时。思路:为什么会超时? 对于每种物品,如果每次在遍历每种物品和每个体积的时候都枚举一遍物品数量,那么时间复杂度会到O(n^3),n=1000时,计算量就到了10亿次的级别,而c++一秒只能算1亿次,所以必须考虑优化。怎么优化? 对于每个物品如果暴力枚举所有数量会超时,那么考虑将一部分物品分组。我们可以将物品按二进制的方式进行分组:1,2,4,8原创 2022-05-31 10:30:55 · 172 阅读 · 0 评论 -
【题解】食物链(并查集)
**题目链接https://www.acwing.com/problem/content/242/**思路:由于我们是逐条看每句话,很多时候我们无法确定所有动物的相互关系。对于无法确定关系的动物,我们可以先将其放到不同集合,而所有关系确定的动物放到同一集合。所有动物的关系与其到根节点的距离相关联,而通过记录其与根节点的关系,我们就可以得知所有动物两辆之间的关系。如果两个点到根节点的距离模3余数相同,则同种动物。否则0被1吃,1被2吃,2被0吃。注意,距离可以是负的,因为我们只需要知道每个结原创 2022-04-21 21:04:28 · 382 阅读 · 0 评论