![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
白书第一章算法设计基础
白书第一章
carut
这个作者很懒,什么都没留下…
展开
-
UVA - 12235 Help Bubu 概率dp 状态压缩 记忆化搜索
问题https://vjudge.net/problem/UVA-11600分析概率dp,看到了N<=30,想到了状态压缩,然后由于N比较大,而且状态中并不是所有状态都存在,所以使用map存储状态对于M条边的处理,有两种办法,一种是用并查集,将连接起来的边连成一个集合,每次到下一个城市的时候,都去查看这个点的父节点和对应的 二进制的值(对应这个集合的所有点)参考:https://www.cnblogs.com/jerryRey/p/4857941.html或者将所有的联通点看作一个点,给这原创 2020-08-12 12:37:42 · 121 阅读 · 0 评论 -
UVA - 1407 Caves 树形dp 多重背包
分析参考:https://www.jianshu.com/p/065cfa72e24b状态的定义比较明显,主要是状态转移部分有点复杂,差点被绕晕了,现在觉得类似于多重背包问题//0-1背包的枚举物品 for(int i=0;i<g[node].size();++i){ pair<int,int> &temp=g[node][i]; //为了放置重复计算,j从大到小进行更新 for(int j=tot[node];j>原创 2020-08-09 17:45:25 · 187 阅读 · 0 评论 -
UVA - 1427 Paradev单调队列
问题https://vjudge.net/problem/UVA-1427分析这道题的状态是dp[i][j],代表走到第i,j的位置时的收入v,采用填表法,到达i,j的选择有三种,一种是dp[i][j]=dp[i-1][j],就是直接从上一行的第j个路口走到这一行的j路口,还有就是从左往右在i行走到j,或者从右往左,转移方程分别是 从左向右dp[i][j]=max(dp[i-1][k]+sum[i][j]-sum[i][k]) , k<j ,sum[i][j]是从i行起点走到第j个路口的累计原创 2020-08-09 15:11:03 · 131 阅读 · 0 评论 -
UVA - 12260 Free Goodie
问题https://vjudge.net/problem/UVA-12260分析这道题的核心在于由于P采用贪婪的方法,所以它一定在前i个中至少占到一半左右的数量,所以d[i][j].value代表在J在前i个物品中占有了j个时候的最大价值,j<=(i+1)/2,然后dp[i][j].loss代表了对于P的总价值造成的损失,设n个P的value之和为sum,P每次选择,都会对sum造成损失,如果损失最小,那么P的最终收益就会最大状态转移过程有点类似于背包问题,每次都是选择或者不选最后一个物品#原创 2020-08-08 17:17:39 · 115 阅读 · 0 评论 -
UVA - 662 Fast Food 区间dp
问题https://vjudge.net/problem/UVA-662分析和上一题UVA607很像,记录一下最优解的状态就行了,另外 区间【l,r】之间的最优点是(l+r)/2,这一点画图就可以看出来代码#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <map>#include <string>#incl原创 2020-08-03 21:09:23 · 112 阅读 · 0 评论 -
UVA - 607 Scheduling Lecture 线性dp
问题https://vjudge.net/problem/UVA-607分析这是一道线性dp,多出了一个需求,就是对应最少课程数的最少DI值,所以可以先求出最少课程数,顺便求对应的最少DI值,每次更新最少课程数时,或者相等时,考虑di值的变化代码#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <map>#include原创 2020-08-03 17:11:09 · 89 阅读 · 0 评论 -
UVA - 590 Always on the run
问题https://vjudge.net/problem/UVA-590分析类似紫书上的例题UVA1025,记得使用转移代价矩阵记录代价,可以缩短查找的时间,时间可以倒推,也可以按照时间正序推#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <map>#include <string>#include <原创 2020-08-03 15:46:12 · 86 阅读 · 0 评论 -
UVA - 473 Raucous Rocker 多维dp
问题https://vjudge.net/problem/UVA-473分析0-1背包问题的变形,相当于有m个背包问题共存dp[i][j][k]代表前i首歌,刻录到第j个盘子的第k分钟时的最大容量,答案是dp[n][m][t]转移方程:第i首歌不存,存两种选择,存的话,有从第j个盘子开始,也可能从j-1个盘子开始dp[i][j][k]=max{dp[i-1][j-1][k],dp[i-1][j][k-time[i]]+1,dp[i-1][j-1][t]+1}这题没给数据范围,所以WA了好几次,原创 2020-08-03 11:35:29 · 143 阅读 · 0 评论 -
UVA - 10254 The Priest Mathematician 汉诺塔变形 线性dp 大数
问题https://vjudge.net/problem/UVA-10254分析汉诺塔问题有三个柱子:https://blog.csdn.net/qq_19446965/article/details/81591945http://baijiahao.baidu.com/s?id=1651515518415910066&wfr=spider&for=pc但是本题中有四个柱子,而且规则有所变化,每次可以先使用4个柱子,按照汉诺塔的移动方式将k个盘子放置在第四个柱子上,然后在移动剩下的原创 2020-08-02 19:11:11 · 122 阅读 · 0 评论 -
UVA - 10453 Make Palindrome 区间dp
问题https://vjudge.net/problem/UVA-10453分析这道题应该是属于区间dpdp[i][j].len表示[i,j]区间的生成回文字符串的最小代价,dp[i][j].s是生成的回文字符串。如果s[i]==s[j],dp[i][j].len=dp[i+1][j-1].len+0, dp[i][j].s=s[i]+dp[i+1][j-1].s+s[j]如果s[i]]!=s[j],dp[i][j].len=dp[i+1][j].len+1, dp[i][j].s=s[i]+原创 2020-08-01 11:13:16 · 91 阅读 · 0 评论 -
大白书/蓝书题单
算法竞赛入门经典训练指南题单:https://vjudge.net/article/61感谢整理者原创 2020-02-26 21:57:47 · 118 阅读 · 0 评论 -
UVA - 1291 Dance Dance Revolution 多维dp
问题https://vjudge.net/problem/UVA-1291分析dp[i][j][k]表示时间点在i时,左脚在j,右脚在k的状态的最小花费使用了二维数组,作为代价矩阵,简化了迈步时的代价计算代码#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <map>#include <string>#in原创 2020-07-31 15:33:43 · 115 阅读 · 0 评论 -
UVA - 1292 Strategic gam 匈牙利算法模板
问题https://vjudge.net/problem/UVA-1351分析这道题一开始是用树形DP来做的,后来看别人博客,发现还可用二分图最小点覆盖来做,二分图最小点覆盖等于最大匹配,使用匈牙利算法来求解https://blog.csdn.net/qq_38956769/article/details/80238896#2-k%C3%B6nig%E5%AE%9A%E7%90%86%E5%8F%8A%E5%85%B6%E8%AF%81%E6%98%8E代码...原创 2020-07-31 09:57:38 · 138 阅读 · 0 评论 -
UVA - 1351 String Compression 区间dp
问题https://vjudge.net/problem/UVA-1351分析代码原创 2020-07-31 11:31:35 · 103 阅读 · 0 评论 -
UVA - 10564 Paths through the Hourglass DP
问题https://vjudge.net/problem/UVA-10564分析这道题用递归dfs,从根节点到叶子,状态从前往后的方法求解比较方便,不用保存字符串,而用递推的方法就比较麻烦些重要参考:https://www.jianshu.com/p/b73bc23897fd(重要的,比较简单的解法)http://www.bubuko.com/infodetail-309480.htmlhttps://www.cnblogs.com/ember/p/4915561.html代码#includ原创 2020-07-29 10:25:48 · 185 阅读 · 0 评论 -
UVA - 1366 Martian Mining
问题https://vjudge.net/problem/UVA-1366分析递推DP,dp[i][j]表示右下角坐标[i,j]的矩形能够运出最多的矿物是多少状态转移: dp[i][j]=max(dp[i][j-1]+B[j][i],dp[i-1][j]+A[i][j]);B[j][i]表示从[i][j]向上运输一条线上一共能够输出的B中矿物A[i][j]是从[i][j]从右向左运输运出的A类矿物代码#include <iostream>#include <cstdio&原创 2020-07-28 16:12:15 · 316 阅读 · 0 评论 -
UVA - 1452 Jump 约瑟夫环
问题https://vjudge.net/problem/UVA-1452分析约瑟夫环的变种,我对于约瑟夫环的理解还是不够,理解了约瑟夫环是一个递归问题,f[1]=0,f[i]=f[i-1]+k mod i是每次重新编号,从结果往开始递归的结果后就解决问题了参见 https://baike.baidu.com/item/约瑟夫问题/3857719?fromtitle=约瑟夫环&fromid=348830&fr=aladdin代码#include <iostream>原创 2020-07-28 15:28:55 · 97 阅读 · 0 评论 -
Save the President UVA - 11589
问题https://vjudge.net/problem/UVA-11589分析这题目的逻辑比较明显。建立数组A[x][y][z][t],找到安全的长方体就可以了。可以暴力求解,但是时间复杂度是O(10^10)左右的,因为有8个循环。将每个不安全的地方置为1,求子长方体的元素和,就是求前缀数组,如果前缀和是0,说明安全。注意遍历时,是从1开始的左闭右闭区间,例如两个顶点是(0,0,0...原创 2020-04-06 21:46:09 · 108 阅读 · 0 评论 -
Subway UVA - 10691
问题https://vjudge.net/problem/UVA-10691分析这道题的思路很直接,就是区间选点问题,然后主要是有的区间会小于-pi或者大于pi,引起问题。注意:如果点到原点的距离小于d就不用往下计算了,直接continue。别人的解法是将超出pi的区间减去pi,就只剩小于-pi的区间和正常的区间,然后全部加上2*pi,重复一遍,遍历可能的初始点,找出最优解。#incl...原创 2020-04-06 13:13:55 · 156 阅读 · 0 评论 -
File Fragmentation UVA - 10132 暴力
问题https://vjudge.net/problem/UVA-10132有n个相同的文件,每个文件恰好分成两半,现在有2n个碎片,求原来的文件是什么?分析这题没啥思路,直接看别人的答案吧。晕,审题不仔细,没有看到每一个文件都恰好分成两个碎片。那就很明显是暴力了。所有的原文件都是相同的,那么先按照长度排序,原文件长度一定等于最长的+最短的。然后最长的和最短的依此拼接,每个拼接结果去校...原创 2020-04-06 00:15:39 · 94 阅读 · 0 评论 -
Soju UVA - 1511 贪心
问题https://vjudge.net/problem/UVA-1511分析两个点(x1,y1)和(x2,y2),现在x1<x2,y1和y2之间的关系未知。∣x1−x2∣+∣y1−y2∣=x2−x1+∣y1−y2∣|x1-x2|+|y1-y2|=x2-x1+|y1-y2|∣x1−x2∣+∣y1−y2∣=x2−x1+∣y1−y2∣,当y1<y2时,x2−x1+y2−y1=−(x...原创 2020-04-05 18:57:13 · 207 阅读 · 0 评论 -
Balancing the Scale UVA - 1381
问题https://vjudge.net/problem/UVA-1381分析一共C168C_{16}^8C168种八元组,对于每个组,计算一共有多少种排列方法使得一行平衡。但是枚举时会超时,所以先枚举所有的4元组,然后计算剩下的12个中有多少个的和和4元组相同。#include <iostream>#include <cstdio>#include <...原创 2020-04-05 12:35:53 · 131 阅读 · 0 评论 -
DNA Regions UVA - 1392 二分法
问题https://vjudge.net/problem/UVA-1392分析先求数组的前缀和,求出满足sum[j]−sum[i]j−1≤p\frac{sum[j]-sum[i]}{j-1}\le pj−1sum[j]−sum[i]≤p的最小i,公式可以变形得到sum[j]−pj<=sum[i]+pisum[j]-pj<=sum[i]+pisum[j]−pj<=sum[i...原创 2020-04-05 00:07:54 · 96 阅读 · 0 评论 -
Genome Evolution UVA - 1481
问题https://vjudge.net/problem/UVA-1481分析给出两个长度为n的集合,问有多少个相同的连续子集合。参考:https://blog.csdn.net/keshuai19940722/article/details/18882795这题主要是没读懂题目是什么意思。#include <iostream>#include <cstdio>...原创 2020-04-04 21:39:01 · 124 阅读 · 0 评论 -
Fire-Control System UVA - 1432
问题https://vjudge.net/problem/UVA-1432求包含至少K个点的最小面积的扇区。分析利用极坐标系,计算每个点的角度和半径大小,然后枚举l,r,注意,角度是个环形。这一题一定要先枚举半径,再角度,不能反过来。小技巧:记录半径的平方而不是半径。扇形公式S=α2r2S=\frac{\alpha}{2}r^2S=2αr2,记住要除以2注意K==0的情况#in...原创 2020-04-04 19:53:56 · 121 阅读 · 0 评论 -
Maximum sum on a torus UVA - 10827
问题https://vjudge.net/problem/UVA-10827分析二维数组最大子矩阵,这题中是带有循环的#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <map>#include <strin...原创 2020-04-04 18:41:39 · 100 阅读 · 0 评论 -
Hypertransmission UVA - 1325 暴力枚举
问题https://vjudge.net/problem/UVA-1325分析原创 2020-04-04 13:00:20 · 111 阅读 · 0 评论 -
Urban Elevations UVA - 221 离散化
问题分析原创 2020-04-03 23:22:37 · 71 阅读 · 0 评论 -
Word UVA - 517 状态压缩 暴力搜索
问题https://vjudge.net/problem/UVA-517分析每次都循环到字典序最小的时候记录。一共最多有2162^16216种,因为每种状态都变到字典序最小的时候,所以实际的远小于2162^16216,使用map保存。先求出一次循环时的长度T,起始点a,终止点b,T=b-a, 答案是第(s-a)%T+a种状态。...原创 2020-04-03 21:11:48 · 109 阅读 · 0 评论 -
Ultra-QuickSort UVA - 10810 归并排序 树状数组
问题https://vjudge.net/problem/UVA-10810分析原创 2020-04-02 18:45:21 · 121 阅读 · 0 评论 -
Antiarithmetic? UVA - 10730 枚举
问题https://vjudge.net/problem/UVA-10730分析判断数列中是否包含至少三个数字pi,pj,pk,i<j<kp_i,p_j,p_k,i<j<kpi,pj,pk,i<j<k,他们能组成等差数列.枚举前两项,判断第三项是否在后面.#include <iostream>#include <cstdio&...原创 2020-03-30 20:54:40 · 90 阅读 · 0 评论 -
Shooter UVA - 10535 最大重叠区间
问题https://vjudge.net/problem/UVA-10535分析最大重叠区间问题,和例题LA 3905一样,如果两个点重叠,左端点在前面(就是因为这一点,一直WA)#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include...原创 2020-03-30 20:29:34 · 92 阅读 · 0 评论 -
Compound Words UVA - 10391
问题https://vjudge.net/problem/UVA-10391分析#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <map>#include <string>#include <v...原创 2020-03-30 16:33:40 · 104 阅读 · 0 评论 -
Game of Sum UVA - 10891
问题https://vjudge.net/problem/UVA-10891分析就是n台计算机上运行这n种服务,每个计算机都可以选择一种服务,使得它和相邻计算机上的这种服务停止,问也最多能够停止多少种服务。#include <iostream>#include <cstdio>#include <cmath>#include <cstring...原创 2020-03-30 16:33:13 · 91 阅读 · 0 评论 -
Foreign Exchange UVA - 10763
问题https://vjudge.net/problem/UVA-10763分析#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <map>#include <string>#include <v...原创 2020-03-30 12:48:42 · 68 阅读 · 0 评论 -
Scanner UVA - 229
问题https://vjudge.net/problem/UVA-229参考:https://blog.csdn.net/accelerator_/article/details/23036013分析一开始想复杂了,以为还要遍历所有的可能性,实际上只需要简单对比是否存在可以涂色的线,如果可以,那么就涂上去,一共73条线在这里插入代码片...原创 2020-03-30 12:40:34 · 102 阅读 · 0 评论 -
The Domino Effect UVA - 211
问题https://vjudge.net/problem/UVA-211分析这题就是DFS,按照行的顺序先按照行再按照列进行DFS。主要是要保存骨牌的信息。#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <map>...原创 2020-03-29 20:59:57 · 93 阅读 · 0 评论 -
Parliament UVA - 668 贪心
问题https://vjudge.net/problem/UVA-668这题一开始没读懂题,参考:https://blog.csdn.net/keshuai19940722/article/details/18258781分析首先求出2+3+4+…+i<=n的最大i,然后将剩余的数字均匀的分配到2-i上面#include <iostream>#include <...原创 2020-03-29 16:37:40 · 112 阅读 · 0 评论 -
Problem Bee UVA - 1531
问题https://vjudge.net/problem/UVA-1531分析设 六边形边长为L,那么六边形的重心坐标是(xL,y32L)(xL,y\frac{\sqrt{3}}{2}L)(xL,y23L),x,y要奇偶性相同。首先求出两个点的所在六边形的中心坐标,然后计算两个六边形的距离。#include <iostream>#include <cstdio&g...原创 2020-03-29 14:08:13 · 134 阅读 · 0 评论 -
Binary Search UVA - 1554
问题https://vjudge.net/problem/UVA-1554按照上面的二分查找程序,会输出, “Found item i = XXX in L =Y Y Y comparisons”,现在给一组i和L,经过了L次查找在a[i]发现,问所有可能生成该信息的N?因为N的数量很多,所以按照区间输出分析从i+1到maxn,遍历所有可能的N,然后对于每一个N,使用二分法查找i,看能否...原创 2020-03-29 11:51:38 · 68 阅读 · 0 评论