
算法
记录学习中遇到的有趣算法
-白羊-
这个作者很懒,什么都没留下…
展开
-
每日dp理解(1)——dp核心元素
从上一次写博客到现在,已经两个多月了。这两个除了在准备期末考试就是打游戏了说实话是有些浪……就当给自己放了一个长假吧:)好了,进入正题。最近两周在算法方面最重要的任务就是捡起假期学的dp并深入学习,理解这类题目的解题思路:明确题目中变化的状态(状态组成事件)——定义dp数组的含义——寻找状态转移方程(状态之间的变化联系)俗话说磨刀不误砍柴工,今天是学习的第一天,首先理解dp的核心元素。1.使用dpTable记录最优子结构,为后续计算提供最优解由于在动态规划的解题过程中常常使用递归,可以列出递归树。原创 2020-09-16 09:13:40 · 867 阅读 · 0 评论 -
P2404 自然数的拆分问题-----理解如何设计dfs
题目描述任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。现在给你一个自然数n,要求你求出n的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。输入格式输入:待拆分的自然数n。输出格式输出:若干数的加法式子。输入输出样例输入 #17输出 #11+1+1+1+1+1+11+1+1+1+1+21+1+1+1+31+1+1+2+21+1+1+41+1+2+31+1+51+2+2+21+2+41+3+原创 2020-07-03 21:57:21 · 275 阅读 · 1 评论 -
P1048 采药-----典型的01背包动态规划问题
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”如果你是辰辰,你能完成这个任务吗?输入格式第一行有 222 个整数 TTT(1≤T≤10001 \le T \le 10001≤T原创 2020-07-03 21:43:37 · 238 阅读 · 0 评论 -
十字爆破——预处理计算矩阵行列和
链接:https://ac.nowcoder.com/acm/contest/5600/I来源:牛客网题目描述牛牛在玩一个游戏:一共有n行m列共nm个方格,每个方格中有一个整数。牛牛选择一个方格,可以得到和这个方格同行、同列的所有数之和的得分。例如:对于一个22的方格:1 23 4牛牛选择每个方格的得分如下:6 78 9因为1+2+3=6,1+2+4=7,1+3+4=8,2+3+4=9。现在牛牛想知道下一步选择每个格子的得分情况,你可以帮帮他吗?输入描述:第一行有两个正整数原创 2020-06-07 18:05:54 · 495 阅读 · 0 评论 -
收集纸片——dsf
链接:https://ac.nowcoder.com/acm/contest/5713/A来源:牛客网题目描述我们把房间按照笛卡尔坐标系进行建模之后,每个点就有了一个坐标。假设现在房子里有些纸片需要被收集,收集完纸片你还要回归到原来的位置,你需要制定一个策略来使得自己行走的距离最短。你只能沿着 x 轴或 y 轴方向移动,从位置 (i,j) 移动到相邻位置 (i+1,j),(i-1,j),(i,j+1) 或 (i,j-1) 距离增加 1。输入描述:在第一行中给出一个T,1≤T≤10T, 1 \l原创 2020-05-30 23:06:41 · 228 阅读 · 0 评论 -
leetcode——136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4看题目要求时间复杂度位O(n), 就想着先利用sort排序,然后在遍历数组,从0开始两个一组进行判断,如果当前组的数字不相等,就输出前一个数。时间复杂度分析:O(logn) + O(n) = O(n)在看过别人的题解之后,发现原创 2020-05-24 19:35:01 · 257 阅读 · 0 评论 -
P1090 合并果子 / [USACO06NOV]Fence Repair G——最小堆
题目描述在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 n−1n-1n−1 次合并之后, 就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为 111 ,并且已知果子的种类 数和每种果子的数目,你的任务是设计出合并的次序方案,使原创 2020-05-14 21:51:28 · 305 阅读 · 0 评论 -
c语言实现堆构建,堆调整,堆排序——详细注释
#include <stdio.h> //关于最小堆,我们关心的是更小的那个节点int h[101]; //用于存储数组int n; //用于存储堆的大小void swap(int x, int y){ int temp; temp = h[x]; h[x] = h[y]; h[y] = temp;}void sift_down(int i) //传入需要向下调整的编号,然后按照最小堆,向下调整{ int t, flag = 0; //t用于存储,flag用于记录是原创 2020-05-13 23:31:13 · 703 阅读 · 0 评论 -
P1162 填涂颜色——dfs算法
由数字000组成的方阵中,有一任意形状闭合圈,闭合圈由数字111构成,围圈时只走上下左右444个方向。现要求把闭合圈内的所有空间都填写成222.例如:6×66 \times 66×6的方阵(n=6n=6n=6),涂色前和涂色后的方阵如下:0 0 0 0 0 00 0 1 1 1 10 1 1 0 0 11 1 0 0 0 11 0 0 0 0 11 1 1 1 1 10 0 0 0 ...原创 2020-04-30 22:22:56 · 397 阅读 · 0 评论 -
P1331 海战
题目描述在峰会期间,武装部队得处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机。此外,巡洋船只和舰队将被派去保护海岸线。不幸的是因为种种原因,国防海军部仅有很少的几位军官能指挥大型海战。因此,他们考虑培养一些新的海军指挥官,他们选择了“海战”游戏来帮助学习。在这个著名的游戏中,在一个方形的盘上放置了固定数量和形状的船只,每只船却不能碰到其它的船。在这个题中,我...原创 2020-04-28 23:11:09 · 366 阅读 · 0 评论 -
P1443 马的遍历——bfs
题目描述有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步输入格式一行四个数据,棋盘的大小和马的坐标输出格式一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)输入输出样例输入 #13 3 1 1输出 #10 3 23 -1 12 1 4...原创 2020-04-27 23:10:51 · 171 阅读 · 0 评论 -
P1141 01迷宫——bfs解法
题目描述有一个仅由数字000与111组成的n×nn \times nn×n格迷宫。若你位于一格0上,那么你可以移动到相邻444格中的某一格111上,同样若你位于一格1上,那么你可以移动到相邻444格中的某一格000上。你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。输入格式第111行为两个正整数n,mn,mn,m。下面nnn行,每行nnn个字符,字符只可能是0...原创 2020-04-27 22:55:58 · 453 阅读 · 0 评论 -
计数质数(统计所有小于非负整数 n 的质数的数量)——埃拉托斯特尼筛法
埃拉托斯特尼筛法简称为埃氏筛,该筛法的思路是:当判断一个数为素数之后,则这个素数的倍数都是和数,利用数组记录。代码实现如下:#include <iostream>using namespace std;const int N = 10000001;int prime[1000000]; //用于记录素数char isprime[N];//用于记录数的性质int mai...原创 2020-04-18 18:02:38 · 225 阅读 · 0 评论 -
判断素数———两种高效算法
相信大家在学习的过程中,时不时就会遇到判断素数的问题。今天就让我们来讨论讨论这个有趣的数学问题,看看如何更高效的来解决它吧!在刚开始接触到这个问题时,我只想到了利用一个循环去在目标数的全部范围内一个一个进行判断的方法。在了解了一些有关素数的知识后,就只用查找到目标数的平方根了。不过查找的效率还是有些低,接下来的两个方法可以更加高效的解决这个问题。一.加长步数素数就是只能被1和其自身整除的整...原创 2020-03-04 12:09:49 · 2729 阅读 · 0 评论 -
算法总结
------打算记录记录在学习过程中遇到的有趣又巧妙的算法------1.数组右移最近遇到了一道二维数组右移的题目,在第一次实现的时候,我用了一个比较麻烦的办法:额外声明一个数组用于存储移动后的结果,将需要移动的数组分成两个部分(需要从后到前进行跳跃移动的部分,和只需要向前移动的部分),分别移动,存储再全部输出。在网上浏览过相关内容后,发现可以直接移动输出。核心代码及解释:m %= n;...原创 2020-03-02 10:01:18 · 223 阅读 · 0 评论