![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C/C++
文章平均质量分 86
总结C/C++语言程设学习过程当中遇到的知识型和技术性问题。力图总结出某种精炼的想法,便于记忆和对未来的指引
Honour Van
新款人工智障
展开
-
写在FLTK Lab之前:GUI及其思考
这是一篇旧笔记,是FLTK大作业开始之前的讲授与说明原创 2020-12-12 15:15:37 · 200 阅读 · 0 评论 -
二维数组指针初始化与读写:以矩阵乘法为例
本文以矩阵乘法为例,以两个基本转换原则说明二维数组指针的用法。同时复习C语言动态内存分配。原创 2020-12-09 20:15:39 · 895 阅读 · 2 评论 -
[pieces] LIS问题的递归写法和二分法
int h[30], k;int dfs(int pre = 0, int cur = 1){ if (cur > k) return 0; return max((h[cur] <= h[pre] || pre <= 0) ? dfs(cur, cur + 1) + 1 : 0, dfs(pre, cur + 1));}后记:学弟提问导弹拦截问题(最长不上升子序列)的递归写法。这是个复杂度很高的算法,出于下次抖机灵方便(误)记录于此。..原创 2020-11-20 11:32:34 · 103 阅读 · 0 评论 -
C++类模板中的友元声明及模板构造函数
转载:C++类模板中声明友元的两种方式,以及构造函数的编写方法转载 2020-09-28 16:08:14 · 811 阅读 · 0 评论 -
洛谷 P1006传纸条 ——四维DP,以及其对应的去重方法
四维DP的典型模板题。注意其中去重使用的思路。因为两条路不能有任何重复的节点,所以这两条路必然分立在整个地图当中,其中一者i(行号)大,另一个j(列号)大。所以对于第一条路,其横纵坐标的枚举是自由的,第二者有了一定的限制。#include <bits/stdc++.h>using namespace std;int dp[52][52][52][52], a[52][52], n, m;int max(int a, int s, int d, int f)//通过重载max函数,将使得原创 2020-06-16 09:24:25 · 533 阅读 · 0 评论 -
[模板] 四维dp
luogu P1004 方格取数#include <bits/stdc++.h>using namespace std;int dp[11][11][11][11], a[11][11], n, x, y, z;int main(){ cin >> n; while (cin >> x >> y >> z && x && y && z) a[x][y] = z原创 2020-06-15 20:59:29 · 623 阅读 · 0 评论 -
洛谷 P4933 大师 dp等差提取
转载自BUAA_Wander https://buaa-wander.blog.luogu.org/solution-p4933的洛谷博客。已经本人授权。思路清晰,尤其关于状态的思考过程,描述极其清晰,详细思忖有大助益。洛谷P4933大师简单分析题目之后,发现这个题就是要我们求原数列中有多少等差子数列。观察了数据范围之后发现,本题目给出了最大高度的范围。要知道给出数据范围的量是很有可能出现在正解复杂度里的(时间或空间),所以我们尽量往这两个上面靠。由于做题不多,所以我想从仅做过的几个模板题里面借鉴一转载 2020-06-15 19:46:59 · 534 阅读 · 0 评论 -
[模板] LIS(最长上升子序列)和 LCS(最长公共子序列)
此段无比伟大而清晰的解释来自阮行止。我仅调整了B序列的顺序,使之最初不为顺序序列(因为我的代码实现在这里栽了跟斗orz)。关于(LCS)为什么可以转化成LIS问题,这里提供一个解释。比如这样的两个序列:A:3 2 1 4 5B:2 5 4 1 3我们不妨给它重新编个号,使得A的逆序为0,即3-a(3标成a),2-b,1-c,4-d,5-e。于是成为:A: a b c d eB: b e d c a这样标号后,LCS长度显然不会因此改变,毕竟没有对原有序列进行任何相对位置的改变。于是.原创 2020-06-14 20:33:38 · 442 阅读 · 0 评论 -
洛谷P2196 挖地雷 —— 更新易位的回溯,或dfs函数结构安排
洛谷P2196 挖地雷通常的回溯问题,代码结构如下:重点有三组四个结构:- 更新结构- check结构- vis-rec结构这里将给出一个相对不同的结构,并思考回溯法解决问题时回溯函数的架构问题原创 2020-06-14 12:13:52 · 564 阅读 · 0 评论 -
洛谷P1106 删数问题——按步骤的贪心法
贪心法可以解决的问题,就是两大类,一种是对元素的贪心,另外一种就是我们这里要讨论的步骤贪心。原创 2020-06-13 15:58:46 · 634 阅读 · 0 评论 -
[pieces] nlogn的LIS(最长上升子序列)实现
使用贪心法,将第k位定义成长为k的LIS末端可能的最小值。思路如下我们构建的存储答案的数组(暂且称为dp数组),其第kkk位表示:长度为kkk的LIS中,末端元素最小的那个LIS的末端元素。①扩展情形:条件:如果要扩展出k+1k+1k+1长的LIS,那么对当前读入的tmp,必须要有长为kkk的LIS且末端元素比tmp小。事实:而我们先前已经得到长为kkk的LIS,其末端元素存储为dp[ptr-1],所以如果末端元素dp[ptr-1]比tmp小,那么就能实现前述的条件。结果:长度增加,获得更优解。原创 2020-06-13 08:54:17 · 449 阅读 · 0 评论 -
[pieces] 画家问题 平方指数到线性指数枚举 两种解法
有一个正方形的墙,由N*N个正方形的砖组成,其中一些砖是白色的,另外一些砖是黄色的。Bob是个画家,想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i, j)个位置的砖时, 位置(i-1, j)、 (i+1, j)、 (i, j-1)、 (i, j+1)上的砖都会改变颜色。请你帮助Bob计算出最少需要涂画多少块砖,才能使所有砖的颜色都变成黄色。原创 2020-06-10 18:28:59 · 585 阅读 · 0 评论 -
Luogu P1650/POJ2287 两序列比较的优胜次数最大化的贪心博弈问题(田忌赛马) 以及基于元素的贪心法证明
贪心法容易理解,但不容易构想出来。关于理解完全可以使用反证的思路,**假设某一步不这么走,就不能取得最优**。这句话正是贪心法证明的核心。我们将通过法一对这个证明方法加以具体化说明,尽管法一是基于元素的贪心。另外多种贪心方法最后都可以证明是同质的。这将在法二中给予说明。原创 2020-06-07 17:08:04 · 526 阅读 · 0 评论 -
Luogu P1135 奇怪的电梯 再谈广搜
P1135广度优先搜索易解的问题有如下的特点:最短为最优每个节点处的规则都唯一确定(不管各个节点的规则是否都相同),保证了单节点只扩展一次。这个题就能很典型地体现第二点。分析这个题目走到每一个节点的时候,上下移动的规则都是相同的,所以扩展一次就不用再次扩展了,采用广度搜索的标准模板即可解。另外如果每个节点处的规则由深度而确定,那么则应使用深度优先搜索。因为广搜时要记录每一层不同的操作数量和操作规则。实在困难。如果中途还能停的话,应该使用广搜(同时不pop,看起来也就不像是典型的广搜了原创 2020-06-07 12:54:54 · 543 阅读 · 0 评论 -
线性动态规划方法论小结
Dynamic ProgrammingDP的前提:有可解顺序:大问题可以拆成小问题。如有环的图上不能跑DAG最短路算法,无环时才能使用DP求出最短路。最优子结构性质:大问题的最优解必须时从小问题的最优解(而不是其他垃圾解)推出来的。无后效性:不用记录先前子结构的过程,只需记录结果。DP三连from 阮行止我是谁把实际局面表达成数学状态我从哪里来设计pull型的转移我到哪里去设计push型的转移如果满足了上述条件就可以DP,写出状态转移方程原创 2020-05-31 17:25:26 · 426 阅读 · 0 评论 -
硬币找零——背包问题,以及循环、递归、动规共通性
在这个题目的基础上,我了解了一下这几个“编程写法”,并对循环、递归、dp有了新的想法。从原理上,这几个想法都是大事化小、小事化了。只不过方向不同罢了。根据The Algorithm Design Manual,解决这类存在顺序解决关系的问题,我们的通用的想法是因为递归实际上是一种更自然的思路,从已知到实现只需迈出一步。这一步也抽象了无数步的实现过程。往往更加清晰实际上我按照这套mindset来考虑dp问题之后,会发现对于并不熟悉的dp题目,明显构思起来要比直接考虑“有什么状态?怎么扩展状态”这套顺原创 2020-05-29 21:35:02 · 986 阅读 · 0 评论 -
数据离散化之后 得到的数组有什么直观含义? 洛谷P1966
博文链接:如果还没有了解过离散化戳这里问题链接:P1966 火柴排队题目给出了INT_MAX级别的数组。这不仅对面子内存是一个挑战,最主要的是分散的数组不利于我们进行连续操作。但是离散化究竟有什么直观的含义呢?好像很多人都同我一样觉得这个很难理解。比如这样一位同学:(我太懂了!!)直入主体数组准备比如思考这样一个乱序的大幅度序列b,构建它的辅助数组a,用来表明序号变化,同时减小数组元素的变化幅度。a: [1] [2] [3] [4] ------------> b:原创 2020-05-25 23:10:55 · 531 阅读 · 0 评论 -
离散化:两种离散化方式详解
————————————————版权声明:本文为CSDN博主「weixin_43061009」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_43061009/article/details/82083983——————————————————————————引入离散化,就是把一些很离散的点给重新分配。举个例子,如果一个坐标轴很长(>1e10),给你1e4个坐标,询问某一个点,坐标比它小的转载 2020-05-25 22:47:04 · 1027 阅读 · 0 评论 -
C++ 实用主义STL速查:常用算法,string,vector, set & map等增删改查(ACM、OI等算法竞赛适用)
文章目录常用算法排序sort和顺序检索lower_bound其他的一些遍历算法累加算法for_each更一般的查找: findcount和count_if最值min_element和max_element删除remove和去重unique变序permutation打乱`random_shuffle()`倒序"一等公民":可变长数组vector增加元素最常用:`push_back()`更高效:`emplace()`更灵活:`insert()`赖皮法:`resize()`删除元素`pop_back()``era原创 2020-05-25 18:50:20 · 999 阅读 · 0 评论 -
[pieces] Quicksort快速排序 模板
模板#include<iostream>using namespace std;int n,a[101];void qsort(int l,int r)//应用二分思想:其实不是严格的二分思想,这里只是借中点作为轴点的候选点{ int mid=a[(l+r)/2];//中间数 int i=l,j=r; do{ while(a[i]<mid) i++;//查找左半部分比中间数大的数 while(a[j]>mid) j--原创 2020-05-25 13:18:50 · 448 阅读 · 0 评论 -
洛谷P1010 自我总结:递归和分治
P1010 幂次方分治的核心是找到每一步的可能结果,不管是正推还是逆推。在这个题当中每一步都有两种可能是2的幂次方不是2的幂次方第一种情况对应着2(solve())的结构第二种对应着寻找一个等比隔项求和式先开始正因为没有定义清楚这个开头,所以导致了很多不必要的时间浪费代码#include <iostream>using namespace std;int a;string res[20] = {"2(0)", "2"}, s = "2(", e = ")";stri原创 2020-05-25 09:24:22 · 526 阅读 · 0 评论 -
洛谷P3612
P3612每次倍增+大数,暗示使用折半。这个题目自己想到了,但是如下两点要注意:注意两点:字符串地址-1轮转过程是要调头的(思考,如果刚好在半处,不该停在这一头,应该找找大端呢)知识总结:一般RE归结为2-3类:暴栈:检查递归的处理,检查函数里有没有开大数组越界:仔细读代码的逻辑/0 或者%0 :自己细读自己的代码代码使用位运算进行折半看起来是一个更好的选择。#include <iostream>using namespace std;long long原创 2020-05-24 21:59:49 · 525 阅读 · 0 评论 -
[pieces]吃甘蔗——两端定个数元素和最大问题
题目题目描述输入输出几种思路前缀和法三种仅求解段和的方法在数组两端滚动拼接数组中段法单中段互补法some trivia题目描述1根甘蔗共有N段,美味度为a[1…N],Sophie想要吃掉其中L段,并且甘蔗只能从2头开始吃。求Sophie能获得的最大总美味度。输入第一行2个正整数N,L第二行N个整数a[i]输出输出1个正整数,代表能获得的最大总美味度几种思路首先要明确一点,就是必须使用long long,否则越界是必然的。前缀和法这个方法上OJ不能AC。虽然在小样本测试下正确。猜测是给原创 2020-05-23 12:19:44 · 926 阅读 · 0 评论 -
洛谷P1990 覆盖墙壁:怎样解决递推问题?
此题在洛谷P1990的基础上,借题解讨论递推问题的一般解决思路。由于这个题目相对新颖,所以很适合用来说明通解想法,是一道值得研究的好题。原创 2020-05-22 18:46:25 · 792 阅读 · 3 评论 -
[pieces] 洛谷P1928, P1164:递归、基础背包
以下这两个题目代表了递推当中的两种基本思路,即递归和递推。P1928分析:这是一个分层的问题,这或许告诉我们层数适量的括号匹配可以通过递归来做,可以大大简化思考量。一份好代码:由于递归使用栈,不需要其他的数据结构来存储分层的信息,所以(?)空间复杂度更低。减少了一次性输入的时间耗费但每次读入一个字符还是很浪费时间的。#include<iostream>using namespace std;string work(){ string ret="";//记录答案 char ch原创 2020-05-22 15:33:17 · 433 阅读 · 0 评论 -
[pieces] 关灯问题:分治、位运算、bool变量取反
这是一道自造题题目描述输入格式输出格式分析要点记录题目描述有一个有灯泡组成的矩阵,其中每行有6个,共5行每一个灯都对应一个按钮,当按下按钮时,该按钮以及周围位置都会改变状态(由暗变亮或由亮变暗)。如图:按下红色处灯泡对应的按钮,周围几个灯泡的状态都发生反转。周围的灯泡状态不一定都是相同的,且关闭后,仍可以因为周围或者本身的操作而重新打开。如下:输入格式无输入。输出格式输出一个5×65\times65×6的矩阵。按钮操作处为111,否则为000。分析第二次按下同一按钮,作用抵消;原创 2020-05-20 14:59:27 · 1124 阅读 · 0 评论 -
[debug][pieces] 洛谷P1002 过河卒——递归、动规复习
递归自顶向下,动规自底向上。递归对应搜索,动规对应递推。递归必须要记忆化搜索,否则会T,由于使用尾递归,在这个情形下和动规效率相差无几。个人更喜欢递归,因为清晰简洁(=______=)#include <iostream>bool tac[22][22];int m, n, hx, hy, dx[8] = {2, 1, -1, -2, -2, -1, 1, 2}, dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};long long mem[21原创 2020-05-19 20:14:22 · 558 阅读 · 0 评论 -
[debug][pieces]洛谷P1518 塔姆沃思牛,P1009 阶乘之和(高精度算法待优化)
P1518关于效率:实际上小规模的函数调用,可能因为编译优化而得到更好的效果,同时,通常较大的模块的函数封装意味着更清晰的程序结构。更能明显降低运行时间的是输入函数的优化。初试:还有一个将init()和find()封装起来的,耗时相当均在180~200 ms。#include <iostream>using namespace std;int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};int fx, fy, fd, cx, cy,原创 2020-05-18 17:06:09 · 445 阅读 · 0 评论 -
[pieces]洛谷P1601,P1303自我总结
P1601不要尝试对字符串作倒序。C语言的难点就在于此。既然对C++相对熟悉不要随意跳出去。string的擦除更改意味着更多的构造和析构。不如建立一个新的字符串进行存储。而且这个500位对于空间复杂度来说根本不是事。500位对应着1 ms之差。此题的类型转换要注意:高位类型和低位类型运算的时候,为避免精度损失,是将低位转化高位类型。因而字符型和整型运算的时候,尽量在关键节点处使用转换。如果不转换,那么最后以数字写入string会乱码(我也不知道为什么)循环的选取:while是断言型,for是次数型原创 2020-05-17 16:54:49 · 541 阅读 · 0 评论 -
洛谷P1042、P2670 自我总结
P1042杂记:oj刷题使用STL会发现时间明显增加。在空间复杂度上看,法一平均更占优势,时间上由于频繁地构造和析构,繁费了大量的时间,本来时间上相当。猜想:将更多地操作挪到循环次数低的循环体中,说不定可以降低时间消耗。另外,使用vector的时候预先reserve,可以大大减小大量数据导致的拷贝开销#include <bits/stdc++.h>using namespace std;int main(){#ifdef _LOC_ freopen("1.in",原创 2020-05-16 15:49:18 · 580 阅读 · 0 评论 -
[debug] dbms lab (4) 文件交流模块——缓存与面向对象、友元函数,增删改查,特判与循环,函数指针,和标志位向量
contents主要架构缓存对象的构建列参数表——有序pair,以及虚函数缓存对象——继承和友元函数缓存结构体友元函数函数实现列参数结构`Col_Info`缓存表对象`Table`创建函数增删改查增insert删delete改update查select效率分析debug与其他思考函数指针与代码优化中途退出的特判问题多向量结构与标志位函数与封装文件流的再思考源码已经全部更新到我的GitHub。主要架构缓存对象的构建为什么要使用缓存对象?其实我们在进行小量存取的过程当中,不加这个缓存,效率并不受影响。原创 2020-05-11 22:29:58 · 432 阅读 · 0 评论 -
[debug] dbms lab (3) sql语言解释器模块——正则表达式、字符串删除收尾空格
ContentsC++正则表达式的使用试验一:嵌套结构的匹配(多层括号试验)试验二:重复结构的匹配(多节匹配)程序架构整体结构命名空间宏保护头文件代码实现分流函数删除字符串首尾的空格语句的解释——正则表达式实例和字符串处理create语句实现use语句实现insert语句实现where子句解释select语句实现update语句实现delete语句实现C++正则表达式的使用为了使用正则表达式,我们或许尝试着全盘学习,教程可见:菜鸟教程:学的不仅是技术,更是梦想!大量的内容并不好用。我们从实用的角度,原创 2020-05-11 17:11:45 · 397 阅读 · 0 评论 -
[debug] dbms lab (2) 主函数与基本交互结构解析
main.cpp首先给出main的源码,随后再来进行相关解释。//main.cppint main(){ Interface main; main.Hello(); while (true) { try{ Interpret(main.Input()); } catch (std::exception& e){ using namespace std; cout << "#ERROR原创 2020-05-11 15:58:13 · 365 阅读 · 0 评论 -
[debug] dbms lab (1) 文件架构相关的背景知识——链接和多文件结构
链接问题一个大一些的工程往往不是只有一个程序文件,经常由好多C程序文件构成,有的时候里面个别程序可能还用的其他语言,编码完成后常常分别编译,编译完成再link到一起。某个C程序需要用到其他程序中定义过的变量,一般都加extern前缀,编译时编译器会预留访问链接的空位,等到link阶段再在整个工程的其他C编译结果中去对号,把访问链接填上。这就是外部链接。如果你程序全写在一个文件里,那永远都不会有外...转载 2020-05-11 15:06:21 · 378 阅读 · 0 评论 -
[debug][随笔] C++ STL容器复习: map & vector
输入忘了只能push_back,然后输入失败;每操作一个新元素都忘了push_back,然后越界。不复习的后果就是成为废人。另外,debug的核心是寻找哪里的输入-输出映射和我们预想的不同。很基本的思想都忘掉了。可以嵌套调用,不能嵌套定义函数。比如这个cmp()#include <bits/stdc++.h>using namespace std;class Stude...原创 2020-05-02 12:24:34 · 405 阅读 · 0 评论 -
[note] C++ 模板与泛型编程
模板背景多个重载的函数的同步的问题:其解决问题的逻辑是一致的、函数体语句相同,只是处理的数据类型不同重复劳动:冗余性改动的危险:不一致性。从而让我们把模板构建的核心放在算法实现上。函数模板定义语法只需在相应函数定义之前加:template<param type-table>然后在函数体中的相应位置使用模板的参数类表中的抽象类型即可。参数类表的构成参数类...原创 2020-04-29 13:04:09 · 315 阅读 · 0 评论 -
[note] C++ STL初步(二) 迭代器、算法和映射
STL算法、迭代器和映射总结迭代器迭代器的提出算法函数独立于数据结构无疑是一种很好的思路,它高度体现了OOP的核心思想。但很快,我们就会发现因各数据结构的访问形式不同,困难显而易见。比如:int sum( vector<int> &v ) // 对向量中的元素求和{ int s = 0; for ( int i = 0; i < v.size(); ++...原创 2020-04-29 13:02:25 · 423 阅读 · 0 评论 -
[pieces] C++全排列 ×3 两份实现,以及喜人的next_permutation()
正解void permutation(int d, int max_depth){ static bool flag = false, used[15]; static char cache[15]; if (d == max_depth) { if (flag) cout << ", "; cout <&l...原创 2020-04-27 13:55:52 · 375 阅读 · 0 评论 -
[note] Effective C++ Note 5
Effective C++ Learning Note 5(undergradute edition)Implementations, and more on Inheritance===========================================postpone Definitions of varsmain purpose: avoid if:in a fun...原创 2020-04-18 22:46:04 · 299 阅读 · 0 评论 -
[note] Effective C++ Chapter 4
Effective C++ Learning Note 4(undergradute edition)Designs and Declarations===========================================we now only treat the possible meaningful advice which can work for classesea...原创 2020-04-17 22:27:37 · 529 阅读 · 0 评论