![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
算法分析
yym68686
这个作者很懒,什么都没留下…
展开
-
[PTA] 7-5 Tree Traversals Again
题目详情题目分析:这道题的关键是如何重建树由图可知,每一次push就是向下建树每一次pop结束后一次push都是创建右子树每一次push之后的连续push都是创建左子树每一次push后的第一次pop都是在图中相当于拐一个弯,但cur(即当前节点的指针)所指向的节点没有变每一次pop之后的连续pop都是向上回溯,我们每一个节点都记录它上一个节点是哪个,此外每一个节点用visit来记录是否已经被pop过了,向上回溯的时候一直要回溯到没有被pop的节点,一旦被访问就将这个节点的visit标记为1原创 2020-09-07 11:27:05 · 189 阅读 · 0 评论 -
[PTA] 7-1 Maximum Subsequence Sum
题目详情题目分析:这是7-1 最大子列和问题的升级版,可以看我这篇题解,方法差不多,唯一的区别就是记录最大子列和的首数字和尾数字我想到了差分数组,先一边输入一边一个个累加,连续的序列和等于差分数组两个数的差,只要遍历差分数组,用在差分数组中遍历到的数字减差分数组中这个数之前的最小的数,等于当前遍历到的数为序列尾的最大连续序列和。遍历所有差分数组里的数,找到最大值。一共num个数tem当前输入的数字minn表示在差分数组中当前遍历到的数字之前的最小的序列和(也就是在差分数组中当前遍历到的数字之前原创 2020-09-05 14:20:46 · 193 阅读 · 0 评论 -
[PTA] 7-2 Reversing Linked List 简单方法
题目详情题目分析:陈越老师说有些同学投机取巧,所以一些结点被放在了链表外面,防止同学们有排序作弊但我还是想办法绕过了老师的坑,我知道这门课学的是数据结构,这题本意想让我们练习一下链表,我这样不用链表的方法让大家见笑了注意并不是所有的节点都在链表里因为是数据结构,所以本题避免用STL来完成题目#include <iomanip>#include <iostream>using namespace std;int start, tmp1, tmp2, tmpNum,原创 2020-09-03 17:03:19 · 363 阅读 · 0 评论 -
[PTA] 7-1 最大子列和问题
问题详情问题分析:我想到了差分数组,先一个个累加,连续的序列和等于差分数组两个数的差,只要遍历差分数组,用遍历到的数字减差分数组中这个数之前的最小的数,等于当前遍历到的数为序列尾的最大连续序列和。遍历所有差分数组里的数,找到最大值。一共num个数tem当前输入的数字minn表示在差分数组中当前遍历到的数字之前的最小的数maxsum表示当前找到的最大连续序列和下面程序一边输入一边计算最大值,降低时间复杂度#include <cstdio>int num, tem, minn,原创 2020-06-22 01:08:59 · 229 阅读 · 0 评论 -
[PTA] 7-2 一元多项式的乘法与加法运算
题目详情题目分析:这一题细节比较多#include <cstdio>int a, b, index, value, q[2222], w[2222], e[4444], r[2222], flag, minn = 0x3f3f3, minnn = 0x3f3f3;int main(){ scanf("%d", &a); for (int i = 0; i < a; i++) { scanf("%d%d", &value,原创 2020-06-22 23:30:54 · 360 阅读 · 0 评论 -
[PTA] 02-线性结构1 两个有序链表序列的合并
题目分析:注意本题List与PtrToNode等效熟悉链表的常规操作List Merge(List L1, List L2){ PtrToNode L3 = (PtrToNode)malloc(sizeof(struct Node)); L3->Next = NULL; PtrToNode pp = L3; PtrToNode p = L1->Next; PtrToNode q = L2->Next; while (p != NUL原创 2020-06-23 18:33:00 · 262 阅读 · 0 评论 -
[PTA] 7-11 关键活动 最短答案!
题目详情题目分析:这一题要注意两点松节点,与该节点相连的所有路径都不是关键路径。规则如下:1.如果该结点发出的所有边,距离下个结点的开始时间都有富余,那么该节点是松节点2.若一个节点发出的所有边都连到了松节点上,那么该点也是松节点3.如果存在多个终点 该节点为终点,且结束时间比最晚的终点要早,那么该终点为松节点求逆拓扑序列只需将拓扑序列倒排一下即可输入样例11 141 2 41 3 32 4 53 4 34 5 14 6 65 7 56 7 28 3 79原创 2020-06-25 13:03:44 · 660 阅读 · 1 评论 -
[PTA] 7-12 排序
题目详情题目分析:插入排序,可以用multiset实现multiset特点:可重复,插入自动排序,时间复杂度低#include <set>#include <cstdio>using namespace std;long n, b;multiset<long> s;int main(){ scanf("%ld", &n); for (int i = 0; i < n; i++) { scanf(原创 2020-06-27 00:21:43 · 519 阅读 · 0 评论 -
[PTA] 7-3 树的同构 并查集实现
题目详情题目分析:这一题没听课,自己写的,按理说数据结构不应该用封装好的STL, 但还是想自己尝试一下,结果导致答案非常短…这一题我用到了并查集,自认为并查集也算是一种树…主要思路就是,先读入数据,用map的键存节点数据,值存父节点的数据,题目保证每个结点中存储的字母是不同的,所以所有的键都不重复。没有子节点的节点一定是叶子,所以我的方法是找到所有的叶子,然后一直递归找到根节点,把每个叶子到根节点的数据连在一起,我们会得到所有叶子到根的路径,最后比较两个树的路径是否一致,一致则同构,不一致则输出N原创 2020-06-27 23:03:25 · 112 阅读 · 0 评论 -
[PTA] 7-4 List Leaves
题目详情题目分析:我喜欢超短的代码!中间会有刻意压行的嫌疑从而影响可读性,还请谅解,我会给每一行标上作用,想浏览其他短代码可以看我其他博文tree[i][0]表示第i个节点的左孩子,tree[i][1]表示第i个节点的左孩子head表示队列头,rear表示队列尾解释一下我如何找根节点的,我们看样例,没有出现的数一定是根节点,那怎么找到它呢?我们知道所有的节点的集合是个递增序列,先算出他们的和,在输入数据的时候出现一个就减掉一个,最后留下来的就是根节点#include <cstdio&g原创 2020-06-29 23:01:26 · 200 阅读 · 0 评论 -
[PTA] 7-4 是否同一棵二叉搜索树
题目详情题目分析:注意释放空间,因为指针申请了空间就会一直在内存里,除非手动释放或程序结束不能直接访问未初始化的指针,这样的指针叫“野指针”,"野指针"不是NULL指针,是指向“垃圾”内存的指针。“野指针”是很危险,if语句对它不起作用。#include <cstdio>#include <malloc.h>struct Tree{ int value; Tree *Left; Tree *Right;};int NodeNum, Tre原创 2020-07-02 01:37:08 · 289 阅读 · 1 评论 -
[PTA] 7-51 两个有序链表序列的合并
题目详情题目分析:注意格式#include <cstdio>#include <malloc.h>struct Node{ int Data; Node *Next;};Node *Read();Node *Merge(Node *L1, Node *L2);void Print(Node *L);int main(){ Node *L1, *L2, *L; L1 = Read(); L2 = Read();原创 2020-07-05 21:35:39 · 445 阅读 · 0 评论 -
[luogu] P4017 最大食物链计数
[luogu] P4017 最大食物链计数题目链接题目分析:太可怕了,食物链的数量不是某一条的最大长度,而是最大食物网里节点的总数。这里是生物学意义上的食物链,是由所有消费者与生产者组成的。#include <cstdio>using namespace std; int n, m, u, v, an, outdu[5555], head[5555], cnt, f[5555...原创 2020-03-22 12:49:41 · 277 阅读 · 0 评论 -
[luogu] P2014 [CTSC1997]选课
题目详情题目分析:f[i][j]表示以i为节点,选j个节点,获得的最大分数dfs(u)的作用就是算出以u为节点时,分别选0~m个节点各自的最大值解释为什么k从j - 1开始,u是v的父节点,选v必须先选u这节先修课。假设如果k能取到j,有f[u][j]=max(f[u][j],f[u][0]+f[v][j]);f[u][j] = max(f[u][j], f[u][0] + f[v]...原创 2020-05-03 13:18:03 · 284 阅读 · 0 评论 -
[luogu] CF607B Zuma
题目详情题目分析:这一题跟P4170 [CQOI2007]涂色类似。(附上本博客题解)。f[i][j]表示区间i~j拿走回文序列最少多少次。状态转移方程:如果i==jf[i][j]=1;f[i][j] = 1;f[i][j]=1;如果i != j 且 s[i] == s[j]:f[i][j]=f[i+1][j−1];f[i][j] = f[i + 1][j - 1];...原创 2020-04-29 10:49:24 · 129 阅读 · 0 评论 -
[luogu] P3146 [USACO16OPEN]248 G
题目详情题目分析:f[i][j]表示区间i~j最大能合出的数。代码中len从小到大枚举区间长度,因为要从小区间转移到大区间。i是区间起点。j表示区间终点。f[1][n]未必是最后的答案,因为这个区间不一定能合并完全。ans在转移过程中取最大值。当f[i][pos] != f[pos + 1][j]时,不能合并,因为这两个区间合并后的两个数不相等,根据题意,不相等的两个数不能合并。这...原创 2020-04-23 00:58:56 · 202 阅读 · 0 评论 -
[luogu] P1005 矩阵取数游戏
题目详情题目分析:这一题数据范围太大,要用高精加,但我使用的是比较简单的__int128。__int128需要用快读才能读入,输出也需要自己写函数。因为每一行的结果都独立,所以我们可以一行一行的做动规。状态转移方程是:matrix[i][j]=max(matrix[i][j],matrix[i−1][j]+temp[i−1]∗base[m−j+i−1]);matrix[i][j] ...原创 2020-04-18 18:55:56 · 168 阅读 · 0 评论 -
[luogu] P3205 [HNOI2010]合唱队
题目详情题目分析:dp[i][j][0]表示在区间[i, j]这个队伍里j从右边加入的方法数。dp[i][j][1]表示在区间[i, j]这个队伍里i从右边加入的方法数。初始化时,dp[i][i][0]显然只有一种方法。循环是从小区间开始推大区间。最后再把区间[1, n]左右加入两种方式总和加起来。#include <cstdio>#define mod 1965082...原创 2020-04-11 17:55:17 · 84 阅读 · 0 评论 -
[luogu] P1220 关路灯
题目详情题目分析:dp[i][j][0]表示从编号i到j的灯关闭且老张关完最后一个灯在i位置,即区间左边时最小功耗。dp[i][j][1]表示从编号i到j的灯关闭且老张关完最后一个灯在j位置,即区间右边时最小功耗。power[i]是从第一个灯到第i个灯的总功耗(前缀和)。因为dp[i][j]必须从dp[i + 1][j]转移过来,所以当转移i + 1时i必须已经转移好了,所以i需要倒序...原创 2020-04-06 11:50:40 · 155 阅读 · 0 评论 -
[luogu] P5858「SWTR-03」Golden Sword
题目详情题目分析:这里的第一种方法有一种剪枝的思想。这个方法是由上一层枚举下一层,在每一次枚举中如果遇到比下一层这个数还要大,说明这个数已经被上一层前面数枚举过了,而且这个数字比当前这个数还要大,所以就没有继续枚举的必要率了,直接退出。#include <cstdio>#include <algorithm>#define MIN -0x3f3f3f3f3f3f...原创 2020-04-04 18:21:16 · 238 阅读 · 0 评论 -
[luogu] P1233 木棍加工
题目详情题目分析:根据Dilworth定理,不下降子序列最小个数等于最大上升子序列的长度。在子序列中转移需要一分钟。所以最大上升子序列的长度就是需要的时间。先对长进行从大到小的排序,再在宽度中寻找最长上升子序列。#include <cstdio>#include <algorithm>using namespace std;struct s{ ...原创 2020-03-31 15:23:17 · 164 阅读 · 0 评论 -
[luogu] P1077 摆花
题目详情题目分析:非常经典的动态规划,dp[i][j]表示从第一种花到第i种花一共j盆花的方法数。我们知道状态转移方程:dp[i][j]=∑kaidp[i−1][j−k]dp[i][j] = \displaystyle \sum^{a_i}_{k}{dp[i - 1][j - k]}dp[i][j]=k∑aidp[i−1][j−k]代码如下:#include <cstdi...原创 2020-03-30 20:27:27 · 107 阅读 · 0 评论 -
[luogu] P4933 大师
题目详情题目分析:dp[i][k]表示以k为公差,a[i]为结尾的等差数列有多少个。而dp的过程是算以a[i]为结尾k为公差,a[1]到a[i - 1]所有以k为公差的等差数列个数的和。#include <cstdio>#define MOD 998244353int n, ans, dp[1111][44444], a[1111];//因为公差可能为负,所以dp下标总体加20...原创 2020-03-29 21:04:15 · 150 阅读 · 0 评论 -
[luogu] P1040 加分二叉树
题目详情题目分析:解法是记忆化搜索。val[i][j]存的是i到j区间内的最高加分。tree[33] 据题意可得,tree数组存的是树的中序遍历顺序。root[i][j]存的是tree数组从i到j的最优根,即以此为根保证此子树最高加分。通过中序遍历性质可知:若x为根节点,1~x - 1为左子树,x + 1 ~n为右子树。代码:#include <cstdio>unsig...原创 2020-03-29 00:30:58 · 97 阅读 · 0 评论 -
[luogu] P2758 编辑距离
题目详情题目分析:dp[i][j]表示a字符串从第一个字符到第i个字符通过最少dp[i][j]次操作,就能变成从第一个字符到第j个字符的b字符串。转移方程:如果a[i]与b[j]相等:那么dp[i][j] = dp[i - 1][j - 1],因为在a前i - 1个字符串最少能通过dp[i - 1][j - 1]次操作转化为b前j - 1个字符串的基础上什么都不干,a前i个字符串也能通过最...原创 2020-03-28 00:46:08 · 135 阅读 · 0 评论 -
[luogu] P1280 尼克的任务
[luogu] P1280 尼克的任务题目详情题目分析:dp[i]表示剩余i分钟时的最大空闲时间,类似01背包那样的资源划分问题,i代表还剩余多少时间,而非是第几分钟。所以我们一开始是从dp[n]开始。如果剩余i时刚好没有任何任务,那就从上一个状态的最大空闲时间转移并加一。如果此时刚好有任务,就转移这个任务的开始时刻时的最大空闲时间。时间复杂度为O(n∗k)O(n * k)O(n∗k)。...原创 2020-03-26 20:59:16 · 83 阅读 · 0 评论 -
[luogu] P1439 【模板】最长公共子序列
[luogu] P1439 【模板】最长公共子序列题目详情题目分析:这个题目用到了离散化的思想,实在太妙了!本题样例:序列A:3 2 1 4 5序列B:1 2 3 4 5我们注意到序列A是乱序的,但我们可以强行顺序化。为什么能强行顺序化呢?因为题目里提供的序列都是全排列。所以从1~n每个数都有一个。我们把序列A中的每个元素分别映射为12345,这样序列B按照对应的映射规则变成321...原创 2020-03-25 22:52:59 · 242 阅读 · 0 评论 -
[luogu] P1020 导弹拦截
P1020 导弹拦截题目详情题目分析:一开始用的单调栈,后来发现不行,因为如果我们假设有这样的序列:3 2 1 99 1当遍历到99时,我们的栈会被我们自动清除,这时最后的最长不上升序列就只有3,而正确答案是4。upper_bound()返回有序序列中第一个大于查找值的指针。lower_bound()返回有序序列中第一个大于等于查找值的指针。思路这道题只有o(nlogn)的算法才...原创 2020-03-24 21:53:29 · 128 阅读 · 0 评论 -
[luogu] P1802 5倍经验日
[luogu] P1802 5倍经验日题目详情题目分析:这道题是标准的01背包,一开始没反应过来,这道题要开long long,不然就只有90分,转移方程f[i]代表使用i个药剂瓶最多能得到多少经验值。一旦剩余的药剂瓶大于面对的敌人所需要使用的药剂瓶,就判断到底是认输经验值多,还是用药剂瓶打赢他的经验多。自己剩余的药剂瓶不够那直接认输,不然会浪费药剂瓶。原创 2020-03-22 14:42:05 · 155 阅读 · 0 评论