【信息机房】信竞知识普及

物理
【信息机房】信竞知识普及

用户头像
榴莲忘返 更新于2025-5-31 07:54:59

先在这里开个坑位,之后我找方法更。

国家竞赛中,信竞占了不可缺少的一部分,即使在这个论坛内也有玩信竞的,所以在此准备对信竞知识做普及到高级算法的研究(可能多为理论,代码会很少)。

也感谢大家可以分享自己已经知道的算法,可以当做分享站。

质心小姐姐如果觉得不太行,我会试着改改(希望能过,毕竟都是竞赛)

收起
16
11
共6条回复
时间正序
用户头像
榴莲忘返
4天前

自古沙发归作者

如果要进行初级学习,可以参考oi维基进行初级知识学习

这帖子可以,你可以详细讲一讲动规和贪心,生物信息那边需要

我都快忘没了哈哈哈哈

1条评论
用户头像
榴莲忘返
4天前

我的想法是电脑用一个账号更新,平板很多时候拿不到……

用户头像
榴莲忘返(llwf)
3天前

dp动态规划

(应 这个可以有 讲解)

注:此文内容以作者本人观点+网上参考资料为主,如有问题可及时提出

动态规划可以理解作递推的一种,只不过动态规划(以后简称dp或动归)

大多数时候可以简化为三步骤:

1.设计状态

这一步通过字面意思,可以理解为:为一个你想要求的答案准备一个状态来表示它。

在这里解释不太清楚,请访问如下题目:https://www.luogu.com.cn/problem/P1048

或简化题面:给定n个物品,给了一个时间T,然后每个物品都给出一个价值和选择所需的时间t(每个物品仅能选一次,也可不选),求在不超过时间T的情况下最多可以获得的价值

此题状态即可设为dp[i][j],表示在前i个物品中选择了总时长不超过j的最大价值

状态设计好就是关键,但状态往往需要进行优化,比如这道题,因为第i个物品选择仅可能与i-1所处状态(即dp[i]与dp[i-1])有关,也就是第i-2位就没有用处了,即可试图压缩第一维i,此处不多讲解,之后再说。

2.状态转移方程

状态转移方程就是根据状态转移过来,即根据一个已知状态推导出下一个状态。

比如还是上文这道题,状态转移方程为:

dp[i][j]=max(dp[i-1][j],dp[i-1][j-t[i]]+v[i])

其中i为物品编号,j为时间,t[i]为第i个物品所需时间,v[i]为第i个物品价值

可以简单理解,在max中(默认你会部分基础,所以不多讲述一些基础知识,但可以发出询问)

第一项即可理解为不做选择(即不选择第i个物品)

第二项理解为做选择(即选择第i个物品),代价是t[i],但价值为v[i],需要寻找上一行状态预留t[i]的时间的最大价值再加上当前状态

3.初始化和求解

初始化中,需要考虑你的状态方程是如何设计,然后在没有任何状态下的初始值

比如这道题,因为在不做选择时价值为0,所以应初始化:

dp[0][0]=0;

但是对于dp其他的状态,需要根据转移方程来进行初始化,比如:

dp[i][j]=max(dp[i-1][j],dp[i-1][j-t[i]]+v[i])

因为要取max,所以多用极大值来初始化,不多讲解

求解中,考虑题意中要求的状态是哪个,这道题就是满状态,即

dp[n][T]

其他题可能因题而异,甚至可能还会有求和、最大值等,不多讲解

动归主体就是这些内容,但是动归可不止这些,在普通动归的前提下延伸出很多,比如和图论结合形成树形dp等,这些之后有想了解者可以问问。

感谢观看

llwf 2025.05.30

尾注:端午假期快乐!

(排版如果不合适可以提出,下次修正)

2条评论
用户头像
-
3天前
建议把题目内容简单说明一下
用户头像
榴莲忘返(llwf) 回复 -
3天前

说明过,但是不太显眼……

用户头像
-
3天前
我周末可以分享并查集和最小生成树,区间 dp
用户头像
-
3天前
前缀和:

假设我们遇到这样一道题目:

输入 $n$ 个数,并给出一些区间 $[l_i,r_i]$,输出每个区间内数的和。

我们显然不能对于每个区间循环求和,这样会 TLE,所以我们需要更快的方法。

我们只需要注意到 $\sum_ni=l}^{r}a_n=\sum_{n=1}^{r}a_n-\sum_{n=1}^{l-1}a_n$,就行了。

因为我们需要求一个区间的和,只需要先求从第一个数到区间末尾的和,减去不属于这个区间的部分,就行了。

为什么这样可以防止 TLE 呢?

假设我们获得了数列 $a_1,a_2,\dots,a_n$,我们可以用 $\mathrm{O}(n)$ 的复杂度求出数列 $s_i=\sum_{n=1}^{i}a_n$,然后如果我们要求 $\sum_{n=l}^{r}$,就可以用 $s_r-s_{l-1}$,然后就没有然后了。
2条评论
用户头像
-
3天前
$\sum_{n=l}^{r}a_n=\sum_{n=1}^{r}a_n-\sum_{n=1}^{l-1}a_n$
用户头像
-
3天前
补充一下,$\sum_{n=l}^{r}a_n=a_l+a_{l+1}+\dots+a_{r-1}+a_r$,这下你们应该能看懂 $\sum$ 符号了。
用户头像
-
2天前
分享一道有趣的题:

存在数列 $a_1,a_2,\dots,a_n$ 和整数 $k$,计算 $b_i=a_i|x$,其中 $|$ 表示按位或。求出使 $b_1=b_2=\dots=b_n$ 不成立的数 $x$,且 $x<2^{32}$。

$0\le a_i<10^9,1<n<10^6$

首先,我们需要了解逻辑或的性质。

$0|0=0$
$0|1=1$
$1|0=1$
$1|1=1$

(以下性质前面都加上 $\forall x$)

性质 1:

$x|y=y|x$

性质 2:

$(x|y)|z=x|(y|z)$

性质 3:

$x|0=x$

性质 4:

$x|1=1$

按位或就是对两个数的每一位进行逻辑或。

e.g. $5|6=(101)_2|(110)_2=((1|1)(0|1)(1|1))_2=(111)_2=7$

性质 6:

$\forall n,x|(2^n-1)=2^n-1$

性质 7:

$x|0=x$

然后,如何解决这个问题呢?

首先,为什么把 $a$ 中的每个数与 $x$ 进行或运算,结果的值会相等?性质 4 说明了不同的数经过或运算之后结果可能相同,我们需要尽可能避免 $1$。

显然,如果 $n|a=m|a$,则 $n|(a|k)=m|(a|k)$。

这时 $a|k$ 的二进制写法中 $1$ 的个数一定大于等于 $a$,所以如果 $a$ 的二进制写法中只有一个 $1$,那么不管怎么改变其他位,$m|a=n|a$ 依然成立。

但我们最不希望原式成立。

所以,我们可以先造一个二进制数 $(1)_2$,与每个数进行或运算,如果结果全部相等,不管前面每一位怎么改变,结果还是相等,所以如果全部相等,则 $x$ 的最后一位一定是 $1$。

然后我们可以尝试 $(10)_2,(100)_2$ 等等。注意 $a_i<10^9$,所以只需要试 $31$ 次就可以了。别忘记最后把它们组合在一起。