![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
学习之路
Ayanoto
这个作者很懒,什么都没留下…
展开
-
2021-02-02
背包问题 一.0/1背包 1.问题模型:给定N个物品,其中第i个物品的体积为Vi,价值为Wi。有容积为M的背包,要求选择一些物品放入背包,使得物品总体积不超过M的前提下,物品的总体积最大。 2. dp[i,j]=Max(dp[i-1,j],dp[i-1,j-Vi]+Wi) memset(dp, 0xcf, sizeof(dp)); //-inf f[0][0] = 0; for (int i = 1; i <= n; i++) { for (int j = 0; j <= m; j++) {原创 2021-02-02 20:09:19 · 106 阅读 · 0 评论 -
2021-01-30
最短路 一.任意两点间的最短路径(Floyd) 借用了动归的思想,d[i,j]保存i到j 的最短路长度 动态转移方程:d[ i , j ]=min(d[ i , j ],d[ i, k ]+d[ k , j ]) void floyd(int n) { for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { dis[i][j] = Min(d原创 2021-01-30 19:02:10 · 211 阅读 · 0 评论 -
2021-01-26
贪心 一.思想:就是走一步看一步,每一步选取当前面临的最优选择,但是这样的目光是短浅的 比如说一个二叉树,只能选择一个子树上的数进行相加然后从选择的子树出发,继续向下找,求最大总和 用贪心的思想你会选择19,然后再选择2。事实上这不是最大的,17-4-100的这条路才是最大的,所以贪心是“目光短浅的” 选用贪心需要满足两个特征: 1.最优子结构。就是说,从局部最优能扩展到全局最优 2.贪心选择性质。问题的整体最优解可以通过一系列的局部最优的选择来得到。 二。常见问题 1.活动安排问题 例题hdu-2037原创 2021-01-26 16:24:20 · 126 阅读 · 1 评论 -
2021-01-26
线段树 一.让你求最区间的区域和之类的其他(或者其他满足交换律的) 二.权值线段树。 1.就是用一个桶(数组)来装一个区间的数在出现的次数 添加 void add(int l, int r, int v, int x) { if (l == r)f[v]++;//f[]用来存x出现的次数 else { int mid = (l + r) / 2; if (x <= mid)add(l, mid, v << 1, x); else add(mid + 1, r, v <原创 2021-01-26 00:05:10 · 63 阅读 · 0 评论 -
2021-01-23
搜索 一.三种图的存储方式 1.邻接矩阵:适合稠密图,但是十分浪费空间,并且存储的时间复杂度高 2.邻接表适用于规模大的稀疏图,存储复杂度为O(V+E) 使用STL的vecto来存储 //定义边 struct edge { int from, to, w; edge(int a, int b, int c) { from = a; to = b; w = c; } }; vector<edge>e[MAXN]; //初始化 for (int i = 1; i <= n; i原创 2021-01-24 09:22:51 · 103 阅读 · 1 评论 -
2021-01-23
1-22二分法 一.1:while(l<r)时 l=mid的时候,mid=(l+r+1)>>1;r=mid-1; r=mid的时候,mid=(r+l)>>1;l=mid+1; 不然就会进入死循环,从而超时 这种情况都是会把logn取满的; 2.在序列是升序的情况下: upper_bound(start,last,n):返回的是被查序列中第一个大于n的指针; lower_bound(start,last,n):返回的是查序列中第一个大于等于n的指针 在序列是降序的情况下: low原创 2021-01-23 00:45:32 · 377 阅读 · 0 评论 -
2021-01-21
1-21并查集 一.基础知识(不多赘述) 1.查询; 2.合并; (并查集擅长动态维护许多具有传递性的关系) 二.两大并查集:1.扩展域并查集。2:边带权并查集 1.POJ-1182(食物链) 本题选用扩展域的方法; 把每个动物拆成三个节点,同类域self,捕食域eat,天敌域enemy; 若“x与y是同类”,说明”x的同类“与“y的同类”一样,同理x,y的捕食域与天敌域也是一样的,所以只要合并x,y的self,eat,enemy 同理若“x吃y”就合并x_eat与y_self,x_self与y_enemy原创 2021-01-21 17:58:03 · 108 阅读 · 1 评论 -
2021-01-20
1.20的STL学习 一.string 1.strlen()的复杂度为o(n),而.length()的复杂度为o(1); 2.find()函数的用法: string s1("11123456"); int p = -1; //寻找所有的"1"的位置 while (s1.find("1", p + 1) != -1) {//如果找不到find()行数返回-1 p = s1.find("1", p + 1); cout << p << "\n"; } 二.erase的使用误区 se原创 2021-01-20 20:26:19 · 135 阅读 · 1 评论