
数据结构与算法
文章平均质量分 62
刷题防痴呆
universal-zby
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
线段树全面学习 (慢慢更新)
线段树的介绍以后再补充,先给算法题型分类吧!首先明确一下,如果难以转化或者满足区间加和问题,那么使用线段树就很难解决问题,所以推荐使用离线的莫队算法(不支持复杂的修改): 对查询的q个区间进行排序以及 在线的分块算法.一 、简单点更新,区间查询的线段树问题这里以区间和为例: hdu1166#include<iostream>using namespace s...原创 2018-03-29 16:40:48 · 219 阅读 · 0 评论 -
DP-背包九讲之01背包
一.问题有N件物品和一个容量为V 的背包。放入第i件物品耗费的空间是Ci,得到 的价值是Wi。求解将哪些物品装入背包可使价值总和最大。二.基本思路:时间复杂度O(VN),空间复杂度优化后O(N)这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不 放。 用子问题定义状态:即F[i, v]表示前i件物品恰放入一个容量为v的背包可以 获得的最大价值。则其状态转移方程便是:...原创 2018-08-15 20:56:37 · 718 阅读 · 0 评论 -
51nod 1130 求阶乘的位数
斯特林公式-求解n!的位数题目链接上述为斯特林阶乘快速求解的近似公式,这个误差值随着n的增大而减小求位数就是log10(x)即可,但是注意到,log10(x)求出的整数部分+1才是x的位数#include<iostream>#include<cmath>using namespace std;#define pi 3.14159265358979...原创 2018-08-01 22:33:21 · 146 阅读 · 0 评论 -
51nod 1384
题目链接全排列 长度<9 暴力#include<iostream>#include<cstring>#include<algorithm>using namespace std;int main(){ char s[10]; cin>>s; int len = strlen(s); sort(s,s+len); do...原创 2018-08-02 17:27:15 · 166 阅读 · 0 评论 -
ACM-动态规划(lintcode专题)总结
最近在lintcode上面刷dp算法,因为本菜鸟的dp实在是很渣,所以下定决心从简单的题目刷起。lintcodeDp算法链接我会挑选几个我觉得做起来不是那么得心应手的题目,把ac以及效率高的代码放上来。中等题:667.最长的回文序列int longestPalindromeSubseq(string &s) { // write your code h...原创 2018-07-22 19:47:53 · 429 阅读 · 0 评论 -
CF #407 DIV2 C题 区间dp
题目链接解析:求最大的区间和问题,联系到基本的区间子段和,但是这里需要注意的是,区间的和与区间[l,r) 中的l 相关,理所当然的解法是对数组先做绝对值差分,但是我们会发现,如果当前位置的值是abs(a[i] - a[i+1]),假如这个位置存在于某个区间[l,r)中,那么只有当i%2 == l%2的时候,才会取的原值,否则需要取相反数。即保证一个奇偶性。那么 对于dp[i]假如认...原创 2018-08-15 09:56:46 · 248 阅读 · 0 评论 -
动态规划题型分类
鄙人dp菜如狗,想花暑假的时间来提高自己的建模能力和dp能力。在网上搜集了大量的资料,dp大致分为以下几类,目前还只会简单的线性dp,等学完后,会不断更新此博客。目前看到的网上比较好的博客:dp分类详解一、线性DP1. 常见模型:背包问题模型:背包九讲字符串dp模型:LIS(最长上升子序列),LCS(最长公共子序列),最长回文序列,字符串最短距离等等。前缀和dp模型...原创 2018-07-23 21:00:21 · 3165 阅读 · 2 评论 -
CF #462 div C - A Twisty Movement
题目链接思路分析:每次看到dp的题目,就很慌,其实慌是正常的,因为这些题目都不正常。看到题目后: 1. 尽可能地分析题目,转换题目意思,得到隐藏的解决策略。2. 找dp状态,和状态转换关系,然后dp方程求解。其实第一步是挺不简单的,需要有观察法的思想。先分析,既然数组只有1 和 2,那么最终一定会有一个断点 11111****22222** 这样的,假如正解的答案是...原创 2018-08-15 11:41:50 · 242 阅读 · 0 评论 -
DP-背包九讲学习目录
目录前言:在学习简单的线性dp和区间dp后,做dp类型的题目开始有些眉目,鉴于dp类型之多,所以趁dp热还在,赶紧开始背包问题的学习。网上资源很多介绍背包九讲,我就不再分享算法细节,而通过每个好题和大家一起来分析和总结心得。章节:第一章 01背包第二章 完全背包第三章 多重背包第四章 混合三种背包问题第五章 二维费用背包第六章 分组背包第七章 有依赖的背包问题...原创 2018-08-15 20:54:26 · 230 阅读 · 0 评论 -
51nod-1089马拉车算法
马拉车算法用于求解最长回文子串的长度。51nod题目链接坑点:1.因为需要在每个字符之间插入#,所以记录数组和新的字符数组的长度应该是2*n,否则会runtime error2.在新的字符串的开头必须加入一个防止访问越界的标记@为什么呢,因为如果不做这个处理会发现在遍历第一个while循环的时候,发生数组越界,所以这也是个坑点#include<cstring>...原创 2018-07-22 15:10:25 · 307 阅读 · 0 评论 -
51nod 1055 斐波拉契数列快速求解
题目链接看到n的数据量就知道不是简单递推了。这里介绍俩种方法:1. 求解数列的递推公式 通过特征方程可以得到这个公式但是发现这里既有浮点数也有除数,取膜的时候就不对了a.对于除数,我们可以找到逆元,求出逆元即可b.对于浮点数sqrt(5),x=616991993是它的逆元,那么用这个数代替sqrt(5)即可对于浮点数1/5 找到逆元是y=200000002...原创 2018-08-01 23:19:41 · 247 阅读 · 0 评论 -
动态规划-整数的划分
#include<bits/stdc++.h>using namespace std;#define maxn 105int main(){ int n,dp[maxn][maxn]; cin>>n; memset(dp,0,sizeof(dp)); for(int i = 1;i<=n;i++) for(int j = 1;j<=n;j++...原创 2018-09-04 21:09:52 · 317 阅读 · 0 评论 -
动态规划-POJ1069
题目链接题目解析:题目说明是每个积木无限个,这是个突破点,不然根本不知道这个木头应该怎么堆放,但是根据题目要求,同一积木同一放法只会出现一次,那么我们只需要把所有积木可能的放法存下来,然后排序,再dp跑一遍就可以了。突破口就是无限个积木,注意坑点就是:底部的长宽都应该严格递增。我开始以为只需要一条边较长就行了~>:<~#include<iostream>...原创 2018-09-03 20:01:18 · 342 阅读 · 0 评论 -
动态规划--最长公共子序列 -空间复杂度优化
#include<bits/stdc++.h>using namespace std;int dp[1005],rec[1005],n,m;char s1[1005],s2[1005];int main(){ while(scanf("%d%d",&n,&m)!=EOF){ getchar(); gets(s1); gets(s2); mem...原创 2018-09-09 20:41:03 · 1692 阅读 · 0 评论 -
字符串--最重要的基本匹配算法KMP
话不多说 ,先上一个板子,通过练习来体会下算法:#include<bits/stdc++.h>using namespace std;int next_[1005],len1,len2;char str[1005],sub_str[1005];void kmp(){ int k = -1,i = 0; next_[0] = -1; while(i<len2){...原创 2018-09-08 11:14:52 · 211 阅读 · 0 评论 -
动态规划--最长上升子序列最大长度 时间复杂度优化
单调队列的维护#include<bits/stdc++.h>using namespace std;int t,n,dp[1005],x,cnt;int f(int val,int l,int r){ int ans; while(l<=r){ int mid = (l+r)>>1; if(dp[mid] > val){ ans =...原创 2018-09-09 20:09:24 · 628 阅读 · 0 评论 -
并查集-区间问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038题目大意:给出许多个区间的和,问你在前面给出的天台见都正确的情况下,当前条件是假的 的条数有多少个题目分析:一般看到并查集的题目,首先要想到怎么去构造,构造的内容有俩个方面,一个是树的根节点的合并,一个是单个树的状态压缩。对于这题,比较经典,我们首先来分析第一个,单个树的状态压缩:原创 2017-08-04 09:56:34 · 1252 阅读 · 1 评论 -
欧几里得算法(扩展欧几里得、欧拉定理、费马小定理)
问题描述: a 和 b的最大公约数是多少?古代解法:辗转相除法迭代过程:例如:{a = 15 和 b = 12 }=>{ a = 12,b = 15 - (15/12)* 12 = 3 }=> {a = 3,b= 12 - (12/3)*3 = 0 }=> { b = 0 所以a为最大公因数}c++代码: int gcd(int a,int b){...原创 2018-04-08 22:32:44 · 3439 阅读 · 0 评论 -
最短路算法 摘要
最短路算法转载 2017-08-11 16:16:58 · 334 阅读 · 0 评论 -
并查集 之最经典带权问题 食物链NOI
参考博客 推荐博客 题目链接:http://poj.org/problem?id=1182题目解释:描述动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",...原创 2017-08-03 14:58:05 · 279 阅读 · 0 评论 -
搜索-POJ3009
题目链接: http://poj.org/problem?id=3009//思路 直接搜索 只是和一般的不同 它会一直走下去 直到碰壁为止 但是这里用一个巧妙点的办法 也是一步一步地走 只是用参数来确定下方向 //总结: 注意在碰壁的时候 就可以进行对四面的搜索而不是单方向的搜索 但是要注意的是 step不要加一//因为在 下次dfs的时候会加一 wa在这真可惜 这里用的搜索原创 2017-08-05 20:38:03 · 210 阅读 · 0 评论 -
二分图 最大匹配 之最小点覆盖
题目链接:POJ2226题目大意:给你一个图 n*m ,由‘ * ’和‘ . ’组成 ,现在你可以用一个长度任意,宽度为1的板子去覆盖所有的*,但是不能覆盖到‘ . ’,问你至少要多少块板子。题目分析://核心思想 如何构建一个匈牙利板子 图 /*把 横纵块做成图中的点 即题目变成求最小的点数使得 所有的原图单点被覆盖 那么这里把原图单点抽象出来 当做现图的边 ,那原创 2017-07-27 15:30:53 · 286 阅读 · 0 评论 -
二分图匹配 之 二维坐标建图
题目链接POJ2446//开始 直接把他当做是 m*n个点建图 这个直接TLE //后来搜到一个建图的方法 先给图黑白染色 相邻的颜色不同 //然后把白色的点放在一个集合 黑色放在一个集合 那么黑白色相邻的点建图 //这样 黑白的点为m*n/2 则32*32/2 大概是 500个点 就不会超时 //这个题目 坑点的坐标居然是读的yx 搞反了找了半天bug #include#in原创 2017-07-27 12:29:02 · 339 阅读 · 0 评论 -
二分图最大匹配之多重匹配
POJ2584题目链接题目大意://题目大意: 若干个人需要衣服 能接受的衣服尺寸大小范围给出但是各个尺寸的衣服数量给定上限 求是否能满足所有人都有衣服分析 : 如果没有给定衣服个数 那么就是一个裸的二分图匹配但是现在给定了匹配对象的限定值 需要用到二分图的多重匹配 题目分析://分析下 匈牙利算法板子/*有俩层判断 一层是判断是否存在路径map原创 2017-07-26 15:39:26 · 688 阅读 · 0 评论 -
2021腾讯笔试 - 计算抛物线与直线的面积
思路:直接积分: 计算交点,求积分公式带入即可(注意积分有两种形式,按y轴积分更简单)抛物线弓形面积:阿基米德算法 直接上结论(抛物线与直线为成的面积等于直线的平行线与抛物线的切点和该直线与抛物线两交点组成的三角形面积 s*4/3)只提供积分方式的解#include <bits/stdc++.h>using namespace std;int main(){ int T; double a, b, c; cin >> T; ...原创 2021-07-18 00:12:32 · 1345 阅读 · 0 评论 -
数据结构与算法- 二叉树的遍历(前序+中序求后序)
#include<iostream>#include<cstring> using namespace std;char s1[2005],s2[2005];int len1,len2;void post(int l1,int r1,int l2,int r2){ if(l1>r1 || l2>r2) return ; int mid = l2;...原创 2018-08-31 22:01:06 · 198 阅读 · 0 评论