摘要:
主要还是讲下hash判重的问题吧 这道题目用的是除法求余散列方式 前几天看了下算法导论 由于我们用的是线性再寻址的方式来解决冲突问题 所以hash表的大小(余数的范围)要包含我们要求的范围 对mod的选取最好是选取范围内较为接近的素数 。 余数的范围和被除数的范围有关! 这个我居然搞错了。。 #in 阅读全文
摘要:
先看看理论: 假设 s-t这条路径为树的直径,或者称为树上的最长路 现有结论,从任意一点u出发搜到的最远的点一定是s、t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两遍广搜就可以找出树的最长路 证明: 1 设u为s-t路径上的一点,结论显然成立,否则设搜到的最远点为T则 d 阅读全文
摘要:
所谓记忆化搜索 就是在搜索的基础上对一些状态进行记录 下次同样状态访问的时候 就不需要重复计算了 典型的空间换取时间的套路 有几点要注意的就是这个东西的使用范围 我个人的感觉是要分析清楚状态转移的过程 这道题目里面的状态分析就有很多子问题是有重复 记忆化搜索是有一定动态规划思想的 巧妙的结合 我们知 阅读全文
摘要:
先介绍一下树状数组。什么是树状数组呢?树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改, 阅读全文
摘要:
有意思的是蓝桥杯的这道题目要求的是每个单位被逆序队包含的次数#include<iostream> #include<cstdio> #include<algorithm> #define maxn 1e5+1 using namespace std; int time[maxn]; void mer 阅读全文
摘要:
题目的意思比较简单,类似计数dp。 一开始我想让dp[i]+=dp[i-prime] 每次遍历比i小的所有素数,然后发现有重叠的 比如 2+3 3+2 就导致错误。看了其他人的填充方式,发现定下prime 然后定向的更新i就可以避免重复问题 还有就是。。 尼玛的素数筛法居然 居然。。写错了。。 反省 阅读全文
摘要:
对于每一个dp的问题 从其最优解的结构(分哪几种形式或者情况)入手 然后分析状态 这样就比较好找出状态转方程这里数据结构的选择很简单 顺序数组就可以 填充的方式顺序填充就可以 然后这道题目卡了我大数。。 #include <stdio.h> #include <string.h> #include 阅读全文
摘要:
简单说下思想(这里引用自http://blog.csdn.net/jarily/article/details/8883858) /* *算法引入: *设G=(V,E,w)是连通的无向图,T是图G的一棵最小生成树; *如果有另一棵树T1,满足不存在树T’,ω(T’)<ω(T1),则称T1是图G的次小 阅读全文
摘要:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 200 using namespace std; struct node { int x,y,z; }; int cmp(no 阅读全文
摘要:
dp的问题除了递推过程的设计之外 还有数据结构的选择以及怎样合理的填充数据 这个的填充是个坑。。#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define 阅读全文