闲聊一下:昨晚写程序设计B作业,只睡了2个小时,(我也沦落了需要最后一天才能交上作业了),虽然要求总结的是这周所学习的内容,但是还是想着继续把搜索这方面给巩固一下,因为我主要负责图论这一方面,所以下一周的话肯定要开最小生成树了(还不是因为我,这种光打codefores了,白天睡觉,就偶尔写了几道零零散散的题,我也不想仅仅只罗列知识点,但是总结题目的方式确实有利于我的理解)
开始正题:
一问:什么是搜索,搜索的本质是什么?
暴力将每一种答案都搜索一遍,找出符合条件的输出(在我看来就这样)
二问:我们在搜索时需要注意什么?
1.搜索是一个递归的过程啊,递归过程是要有出口的(出口我怎么去写)
2.VIS数组标记,标记过的点不再进行访问。
3.回溯的条件该如何去写。
基础的点:
算法笔记DFS总结1_钟一淼的博客-CSDN博客
两道例题:
解释一下我的思想:(我题目的分析应该都比较明确)
DFS:
P1036洛谷选数_钟一淼的博客-CSDN博客
注意点:
1.回溯上,因为这边累加的和进行回溯操作。
2.单独设置一个变量进行记录访问到第几个数了。
BFS:
P1135 奇怪的电梯(淼淼总结BFS)_钟一淼的博客-CSDN博客
注意:
1.BFS运用队列,多数需要定义结构体。
2.判断范围条件写好 ,一定得保证它在这一范围区域内进行搜索。
关于孤岛的问题:(面积扩张)
P1596 [USACO10OCT]Lake Counting S(DFS)_钟一淼的博客-CSDN博客
还是不停的搜索其他的相同的点,搜过的点标记出来即可。
搜索(进阶):
剪枝思想:
搜索到一定深度时已经不满足于题目的条件,那继续往下搜索的内容肯定也不满足条件,直接return;不进行搜索,提升算法效率。
例题:
P1433 吃奶酪(DFS剪枝)_钟一淼的博客-CSDN博客
POJ 1419-Graph Coloring_钟一淼的博客-CSDN博客
二,蓝桥杯的总结:
(就一些算是小积累吧,这周确确实实没开大章,下周图论和最小生成树)
1.欧拉定理:
平面的增加=交点分割线段的个数。
蓝桥杯(平面切分)_钟一淼的博客-CSDN博客
2.动态规划基础问题:
基础点的话还是看我我上次写的博客:
动态规划入门_钟一淼的博客-CSDN博客
这次主要来介绍一下数字三角形:
1.其实这一道题目是有一个基础版的->
P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1216题目分析:就是从下到上不停的更新加上左下值或者加上右下值,谁更大,更优!
状态转移方程:
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int mp[1010][1010];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cin >> mp[i][j];
}
}
for (int i = n - 1; i > 0; i--) {
for (int j = 1; j <= i; j++) {
mp[i][j] += max(mp[i + 1][j], mp[i + 1][j + 1]);//更新最大值
}
}
cout << mp[1][1] << endl;
}
2.进阶版本:
数字三角形 - 蓝桥云课 (lanqiao.cn)
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int mp[1010][1010];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cin >> mp[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j<=i; j++) {
mp[i][j]+=max(mp[i - 1][j], mp[i - 1][j - 1]);
}
}
if (n % 2 == 0) {
cout << max(mp[n][n / 2], mp[n][n / 2 + 1]) << endl;
}
else {
cout << mp[n][n / 2+1] << endl;
}
}
或许一些零零碎碎的知识点没什么大用,但就是单纯觉得积累一下会比较好,(其实这个是考研大的学长问我的,否则这星期就真的水过去了)。
三,Codefores比赛的总结
先分享一下我的心得吧,我是真的菜啊(我看到同样是19岁,人家都已经上紫了),我还在与第三道题斗智斗勇,啊啊啊啊!
比赛总结:
Codefores CodeTON Round 1 (Div. 1 + Div. 2)比赛总结_钟一淼的博客-CSDN博客
基本需要注意的点都已经写好了,还是算法的优化和数学思维的掌握吧!
关于STL如何降低复杂度?
Codefores CodeTON Round 1 B题_钟一淼的博客-CSDN博客
这里利用了map函数进行优化;
也可以用vector进行优化:(算是STL的一个广泛应用)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int t;
cin >> t;
while(t--) {
int n, a;
cin >> n >> a;
vector<int> v(n);
for(int& x : v) cin >> x;
bool ans = false;
if(n == 1) ans = (v[0] == a);
else {
sort(v.begin(), v.end());
int i = 0;
int j = 1;
while(j < n and i < n) {
if(v[i] + abs(a) == v[j]) {
ans = true;
break;
}
else if(v[i] + abs(a) < v[j]) ++i;
else ++j;
}
}
if(ans==true){
cout<<"YSE"<<endl;
}else{
cout<<"NO<<endl;
}
}
}
贪心思想:
总结的一个小题:
Codefores教育代码第125轮C题_钟一淼的博客-CSDN博客
四,周总结
这周真没学什么很系统的东西,还是主要复习了复习搜索的知识点,练了一些题目,虽然阅读的东西很多,但我总觉得我没有吸收进去,所以这周才更加仔细的推敲某些题目,更加深入的了解,零零碎碎的一些东西就全当是积累了,毕竟数学的内容挺多的,还是需要定时积累的,下周的话就赶新课,最小生成树,不能松懈,继续坚持。