本篇持续更新
P1144 最短路计数

P1144最短路计数[普及+/提高]

由于这道题的特殊性(所有边的边权都是1),所以我们可以只进行简单的BFS

由于要求最短路,所以当前在求的点\(i\)的上一个点在搜索树种一定是来自于上一层,不可能来自同一层,所以到点\(i\)的当前路径的长度只需要让上一层的那个点对他进行更新即可

再因为本题的\(ans\)要求的是到\(i\)点的最短路的个数,所以如果到点\(i\)的当前路径的长度等于上一层的每一个点的路径+1,那么这肯定是到点\(i\)的最短路

P1352 没有上司的舞会

P1352没有上司的舞会[普及/提高-]

这是我第一次做有关树形DP的题目,因为题目难度不高,所以还是比较好想的

设\(f_{i0}\)是当第\(i\)个人不参加舞会时的\(max\),\(f_{i1}\)是他参加舞会时的\(max\)

根据题目所给到的关系,当一个结点(人)的父节点(领导)来的时候,这个人是不参加舞会的,所以对于\(i\)的下属\(j\)就有,\(\begin{cases} f_{i0}=max\{ f_{j0},f_{j1}\} \\ f_{i1}=a_i+f_{j0}\end{cases}\)

这里的\(a_i\)是每个人的欢乐值(结点的权值)

可以显然得到的是,上述柿子只有从根节点开始才能计算出对于每个节点的\(f_{i0} , f_{i1}\),从而才能算出对于根节点的\(f_{root0},f_{root1}\),最后\(ans=max\{f_{root0},f_{root1}\}\)即可

那么我们就需要找到\(root\)的编号,根据本题的特殊性,\(root\)结点即为没有上司的结点,在输入关系的时候我们用一个\(bool\)数组来标记即可,全部输入完毕之后,再根据标记来判断\(root\)

P1015 回文数

P1015回文数[普及-]

其实做这道题的初衷是为了让橙题AC数量凑个整数

这道题其实按照题目的要求进行模拟即可,每次将一个数的位数正序与逆序相加,需要用到高精。对于大于10进制的情况,将其每一个用字母来表示的位对应的转化为一个十进制数即可

P1158 导弹拦截[NOIP2010PJ]

P1158导弹拦截[NOIP2010PJ][普及/提高-]

看似这道题是和另外一道DP题重名,实际上这个题是一个排序+模拟,因为只有两个导弹系统,所以我们考虑用第一套拦截较小范围的,第二套拦截较大范围的

在用到第一套系统的距离进行排序,然后依次枚举即可

P1190 接水问题[NOIP2011PJ]

P1190接水问题[NOIP2021PJ][普及-]

这题就真的是老水题了,模拟一下接水过程即可

P1309 瑞士轮[NOIP2011PJ]

P1309瑞士轮[NOIP2011PJ][普及/提高-]

这道题是一个很典型的归并排序

主要思路就是每次维护赢家和输家两个数组,然后在每次比赛之后进行归并

在最一开始使用sort排序一遍,然后每次比赛完之后merge即可

PS:STL中是有merge的:

merge函数的作用是:将两个已经排好序的序列合并为一个有序的序列

函数参数:merge(first1,last1,first2,last2,result,compare);

实际上就可以这样用:

inline bool cmp(int x,int y){return x<y;}
int a[114514],b[114514],c[114514];
...
merge(a+1,a+114514,b+1,b+114514,c+1,cmp);
P1982 小朋友的数字[NOIP2013PJ]

P1982小朋友的数字[NOIP2013PJ][普及+/提高]

我直接推荐第一篇题解

P1095 守望者的逃离[NOIP2007PJ]

P1095守望者的逃离[NOIP2007PJ][普及/提高-]

能闪则闪,否则就走,若能力值够了就恢复,最后将本次的值进行比对,

看是这次 走 快还是 停下来恢复 或 闪 快

P2398 GCD SUM

P2398 GCD SUM[提高+/省选-]

设\(f_i=\gcd(i,j)=k\)

\(g_k\)为能被k整除的\(\gcd(i,j)\)的个数

很明显就有\(g_k=\sum\limits_{t=1}^nf_{t*k}\),因此\(g_k=\lfloor\frac{n}{k}\rfloor^2\)(对于i有floor(n/k)种,对于j也一样)

P1390 公约数的和

P1390公约数的和[省选+/NOI-]

思路和上一题基本一致,最后答案输出时\(\frac{ans-k}{2}\)即可,其中\(k=\frac{n(1+n)}{2}\)

P1541 乌龟棋[NOIP2010TG]

P1541乌龟棋[NOIP2010TG][普及+/提高]

很明显的一个DP题,且方程是比较好推的

由于题目中说了一共只有4种卡牌,且对于100%的数据:每种牌的数量都小于等于40

因此我们可以开4维数组,\(f_{xyzw}\)代表分别用x张1,y张2,z张3,和w张4所能得到的最大值

那么就可得出方程:

 

\[f_{xyzw}=max\{f_{xyzw},f_{x-1yzw}+a_{x+2y+3z+4w},f_{xy-1zw}+a_{x+2y+3z+4w},f_{xyz-1w}+a_{x+2y+3z+4w},f_{xyzw-1}+a_{x+2y+3z+4w}\} \]

 

当然,前提是保证计算\(x-1,y-1,z-1,w-1\)时,对应的\(x,y,z,w\)都不为0

P3842 线段[TJOI2007]

P3842线段[TJOI2007][普及/提高-]

DP,在这里是设置了二维的一个状态,\(f_{i,0}\)表示从第i行最左端开始走的最短路径长度,\(f_{i,1}\)则是到第i行最右端开始走的最短路径长度

那么除了第一行外,当前的从左端点开始走的最短的路径就是上一行的对应的左端点+上一行的线段的左端到这一行的线段的右端的长度+这一行的线段长度+1。或者是从上一行的右端点来(计算方法同理,将左端点改为右端点即可)。

当然,从右边开始同理。

那么状态转移方程就是这样的:

 

\[f_{i,0}=\min\{f_{i,0}+dis\{x_{i-1,0},x_{i,1}\}+dis\{x_{i,0},x_{i,1}\},f_{i-1,1}+dis\{x_{i-1,1},x_{i,1}\}+dis\{x_{i,0},x_{i,1}\}\}+1 \\ f_{i,1}=\min\{f_{i,0}+dis\{x_{i-1,0},x_{i,0}\}+dis\{x_{i,0},x_{i,1}\},f_{i-1,1}+dis\{x_{i-1,1},x_{i,0}\}+dis\{x_{i,0},x_{i,1}\}\}+1 \]

 

P2016 战略游戏

P2016战略游戏[普及/提高-]

一个最为基础的树形DP

通过观察样例我们可以发现:实际上只需要考虑对于某个节点,我们只需要考虑这个节点要不要放士兵即可

那么我们每次取放/不放的最小值即可

P1359 租用游艇

P1359租用游艇[普及-]

树形DP,先存边,然后遍历n的上游和i的下游节点,比较路径长度即可

P1122 最大子树和

P1122最大子树和[普及/提高-]

树形DP,先存边,然后进行两个DFS

P1747 好奇怪的游戏

P1747好奇怪的游戏[普及/提高-]

BFS,做这道题的初衷是为了复习一下搜索,感觉自己快忘了

最一开始提交竟然WA,原来是BFS第二个时把BFS(X2,Y2)错写成了BFS(X2,Y1),草(一种植物+中日双语)

P1746 离开中山路

P1746离开中山路[普及/提高-]

BFS,和上面那道题基本一致

简单的打了一遍模板,修改几个参数就好了(

P2615 幻方[NOIP2015TG]

P2615幻方[NOIP2015TG][普及-]

不是吧2015年的D1T1就这么水

做题的初衷是为了完成任务

一眼知模拟,所以就按照条件简单做就行

因为数组表示起来不是很好想,直接放弃使用数组下标

选择用结构体,求每个数字的坐标,最后再赋值给数组以便输出,中间走样例炸了一次,是没做位置是否有数的判断,因为懒得再去大改,而且这题范围允许,就维护了一个bool数组

做的时候觉得应该能煺柿子,AC完一看题解,还真有公式啊

P2298 Mzc和男家丁的游戏

P2298Mzc和男家丁的游戏[普及/提高-]

BFS,和前面的P1746思路基本一致,典型的迷宫+BFS,维护一个dis数组即可

但是分析的时候错误的打了个else导致我调了二十分钟???

P1332 血色先锋队

P1332血色先锋队[普及/提高-]

看完题面第一反应:好!我是叛徒

BFS,但不完全是BFS板子,这是多起点多终点的

啊那就直接把起点全部压进队列去不就行了么

然后更新dis,最后按照顺序输出即可

然后我因为BFS函数没调用查了≈40min???

感谢!已经气懵了

P1141 01迷宫

P1141 01迷宫[普及-]

别看这是一道普及-,这题可比前面的5道题强多了

首先输入需要用字符串,迷宫类问题常规操作,还行

然后这题如果直接按照输入数据一组一组的BFS的话最多拿70pts,会TLE三个点

那么我们考虑计算连通块,然后输出要查询的点所在的连通块的大小即可

P1162 填涂颜色

P1162填涂颜色[普及-]

哦,又是一道普及-

这道题做法很多,我在这里考虑DFS

因为在题目当中0有两个意思,所以将他们换成不同的数字在进行分析

但是不能直接DFS,那样会把边缘误涂,应该先DFS一边边缘,再进行正常DFS,所以最一开始输入的是DFS(0,0)

P1683 入门

P1683入门[普及-]

哦,双是一道普及-

这道题显然的DFS,甚至还不用回溯,找到起点直接DFS即可

CF414B Mashmokh and ACM

洛谷:CF414B Mashmokh and ACM[普及/提高-]

CF:Codeforces Round #240(Div.1) ##B

搜索做累了,水一个DP

由于对于一个数而言,它的因数并不好枚举,所以在这里考虑倒退,即去推某个数的倍数

P1586 四方定理

P1586四方定理[普及/提高-]

DP,状态很好想,是一个类似部分背包

由于是多组数据,可以先预处理,然后把输入的数据的f[n][1~4]加起来就行

AT1350 深さ優先探索

AT1350 深さ優先探索[普及/提高-]

顾名思义,这是AtCoder的DFS模板题,锻炼一下DFS用的