03 2023 档案
摘要:思维题: 显然每个行可以互相独立来处理。 贪心和暴力显然都不容易处理这题,所以我们只能考虑dp。 每次只能取最左边和最右边的数,这显然很符合区间dp的特点。 所以我们令dp[i][j]为取[i,j]区间所能获得的最大值 最后的答案便是dp[1][len]的累和 现在想dp[1][len]该如何获得呢
阅读全文
摘要:一道很妙的状压dp,差不过做过才会,数组设置的很妙也很难 我们对 T 字符串进行考虑 首先T字符串每一位 只能是小写字母。 所以我们可以先预处理 T字符串每一位 为某个小写字母时,对应到S字符串集里面,能匹配那些S字符 令f[ i ][ j ]为T字符串第 i 位,为 j 小写字母时,对应到S字符串
阅读全文
摘要:这道题跟 P3092 [USACO13NOV]No Change 很像,比较妙的状压dp 首先M<=20,由这一部分可以从状压入手 首先令dp[i]为状态为 i 时,最少的出队人数 我们知道了 i 的状态,让 i 中的所有队都尝试放在最后排 现在我们要让 j 放在最后排,那么我们已经知道了dp[i^
阅读全文
摘要:一道很妙,也挺有技巧的状压dp题。 我们从k入手,k的范围很小,且本题是按顺序购买的。 接下来是本题的核心:dp[i]是状态为i时,最多能买多少物品数 接下来是dp的状态转移: 我们知道 i 的状态有那些为1,我们把第 j 个钱放在最后花,然后已经知道了 dp[ i^(1<<j) ] 的最优解,便可
阅读全文
摘要:首先是考虑dp状态的问题:这道题主要处理的是 上行和上上行的状态。 假如我们令dp[i][x]来表示状态,仅用dp[i-1][y]来转移是不够的 所以我们dp状态不仅要有本行的状态,还要用上一行的状态。 令dp[i][x][y]为第i行的状态为x,第i-1行的状态为y时,最多的炮兵个数 然后便是预处
阅读全文
摘要:状压dp模板题: dp[i][j][k]为到了第i行,第i行的状态,一共有多少的国王。 预处理出第i行的所有可行的状态,显然不能有国王相邻,也不能有超过k个国王的可能 dp转移: 显然dp[ i ][ x ][ k ]是上一行情况累加过来: dp[i][x][k]+=dp[i-1][y][k-pop
阅读全文
摘要:1.要状压的那一维,所有有关的下标要从0开始,而不是从1开始 2.预处理很重要,可以说基本所有的状压dp都要有预处理这玩意
阅读全文
摘要:这道题最妙的是移入bitset,来统计能组成那些数 令bitset<2010> S; 一开始初始化S[0]=1 对于w[i],S<<w[i]表示原本能组成的数加上w[i]后组成的新数 但原本的数我们依旧是要的,所以便是S=S|(S<<w[i]) S.count返回S中1的个数,但是无符号的数据类型要
阅读全文
摘要:P4395 [BOI2003]Gem 气垫车 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 类似于cf特色题 不能简单的(1,2)两个值进行考虑 显然 1的编号为2,2的编号为3,其余都是1才是特殊情况 我们令dp[x][i]为x节点为i时,所能获得子树最小值 dp[x][i]=
阅读全文
摘要:1.树形dp的 for 循坏能优化就优化,比如取j=min(size[x],m),k<=min(size[x],m)之类的,否则很容易TLE 2.要考虑清楚不合法状态是否会对答案产生影响,如果有就要memset(dp,-1,sizeof(dp))和初始化,树形dp中跳过dp[x][j]=-1和dp[
阅读全文
摘要:P3177 [HAOI2015] 树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 考虑树形dp:令dp[x][j]为以x为根的子树中有j个黑点。 子节点的合并出父节点,显然为背包树形dp。 则dp[x][j]=max(dp[x][j],dp[v][k],dp[x][j-k
阅读全文
摘要:P3047 [USACO12FEB]Nearby Cows G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 树上思维好题 这道题不是树形dp,但是我们要用树形dp的思维来做这题. 首先我们令:dp[x][i]为在x的子树中,与x不超过i距离节点的权值之和。 显然这是很容易求的
阅读全文
摘要:P1270 “访问”美术馆 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 经典二叉树dp问题 这道题的建图很有意思: 以及细节处理来回走的trick:小偷最后是要从原点逃出的,所以我们要把每条边的长度*2,来方便处理 void build(int x) { dis[x]=read
阅读全文
摘要:P1131 [ZJOI2007] 时态同步 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这更多是一个思维题 看到上面这副图,我们的想法是先让 1→2和1→3拉伸到1→4的深度,再让5→1的叶子拉伸到5→6 我们便令dis[x]为x子树中最深的深度,对x节点进行操作 我们已经在v
阅读全文
摘要:P1273 有线电视网 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 令dp[x][i]为第i个节点,转移x个客户的最少费用 转移:dp[x][i]=max(dp[x][i],dp[x][i-k]+dp[v][k]-val[x][v]); 背包树形DP 但是这题获取最重要的便是,
阅读全文
摘要:P2014 [CTSC1997] 选课 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这题的技巧:把这些没有父亲节点的点,把他们的父亲节点令为0,则可从多课树变成一棵树。 细节:由于0点是必须取的,所以m要加1 其他便是正常的背包树形dp Code: #include<bits/
阅读全文
摘要:P2015 二叉苹果树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题之所以可以不用背包树形的原因是:它一个经典二叉树dp问题 令son[x][0]为x的左儿子,son[x][1]为x的右儿子 对于x节点,肯定是由左边和右边转移过来的,这就是二叉树dp的特点。 对于左边而不
阅读全文
摘要:P2015 二叉苹果树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 背包树形dp主要是用来处理 可以取若干个子节点若干个情况,来实现dp转移到父节点 我们令dp[x][y][i]为先取第x个节点下,前y个子节点留i条边的最大值。 转移: if(j!=0) dp[x][y][i]
阅读全文
摘要:P1122 最大子树和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目就是要求:树上点权之和最大的一个连通分量 令dp[i]为必须选i节点的情况下,最大的子树点权和 则有转移方程 dp[x]+=max(dp[v],0); 初始化dp[x]=a[x]; 注意:最后的答案显然不是
阅读全文
摘要:P1220 关路灯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 本题有个很重要的信息:大爷是可以随手关灯,所以对于区间[i~j],出于贪心,大爷最后要么在 i 位置,要么在 j 位置。 令DP[i][j][0/1],为0时在 i 位置,为1时在 j 位置 关掉区间[ i , j
阅读全文
摘要:Zuma - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 跟 P4170 [CQOI2007]涂色 很像。 令DP[i][j]为消灭区间(i~j)所需要的最少次数。 考虑dp[i][j]的转移: 如果a[i]==a[j],则有dp[i][j]=dp[i+1][j-1]因为最后区间[
阅读全文
摘要:P4170 [CQOI2007]涂色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 设DP[i][j]为完成(i-j)区间的最少涂鸦次数。 考虑dp[i][j]的转移:重点:如果s[i]==s[j],dp[i][j]=min(dp[i][j-1],dp[i+1][j]),因为颜色
阅读全文
摘要:[ABC231E] Minimal payments - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目关键信息,a[i]是a[i-1]的倍数,a[1]=1; 举例一组数据: 3 129 1 10 100 显然可以有,2*100找零,100+3*10找零,或直接100+2*10+
阅读全文
摘要:[ABC237F] |LIS| = 3 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题的技巧性很强:考虑到最长上升子序列的长度只有3. 我们令DP[长度][所有LIS=1最后一个元素的最小值][所有LIS=2最后一个元素的最小值][所有LIS=3最后一个元素的最小值]为方案
阅读全文
摘要:Anna, Svyatoslav and Maps - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 首先用floyd跑一遍最短路。 对于p序列的两个点:如果 dis[p[i]][p[j]] = j-i,则序列p是经过 p[i]~p[j]的最短路. 假设现在存入 v 数组的最后一个点
阅读全文
摘要:P3205 [HNOI2010]合唱队 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题 大区间包括小区间,每加一个人都会让区间更大; 考虑区间DP: 对于区间 [ i ~ j ] ,这段区间最新进的人只有两种可能 i 或 j 所以我们定义: f[i][j]最后一个加的人是
阅读全文
摘要:P1880 [NOI1995] 石子合并 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 本题重要的是是个圆。 圆的通常思维,是把圆拆成两条链 这样子 n 变成 2*n(区间dp模板题) #include<bits/stdc++.h> using namespace std; #d
阅读全文
摘要:区间dp一般都比较死板 DP[i][len]表示从 i 开始,长度为 len 区间dp通常数据N为300,400,500 几百的大小,或者1000 for(int len=2;len<=n;len++) for(int i=1;i+len-1<=n;i++) for(int j=i;j<i+len-
阅读全文