首先来看一道我编的题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共有 \(m\) 个不同的 主题 . 为了方便描述,我们对词牌名从 \(1\) ~ \(n\) 编号,对主题从 \(1\) ~ \(m\) 编号. 安娜准备了若干首诗,每首诗都有 恰好一个 词牌名与 恰好一个 主题. 更具体地说,安娜为第 \(i\) 个词牌名第 \(j\) 个主题准备了 \(a_{i…
首先来看一道题题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共有 \(m\) 个不同的 主题 . 为了方便描述,我们对词牌名从 \(1\) ~ \(n\) 编号,对主题从 \(1\) ~ \(m\) 编号. 安娜准备了若干首诗,每首诗都有 恰好一个 词牌名与 恰好一个 主题. 更具体地说,安娜为第 \(i\) 个词牌名第 \(j\) 个主题准备了 \(a_{i,j…
题目传送门 解题思路: 对于每一个列c,f[i][j][k]表示到第i行,第c列选了j个,其它列一共选了k个,然后我们读题意发现只要j>k,那就一定是不合法的,然后统计所有方案,减去所有不合法方案,即为答案. 代码里有注释. //只做了84分,懒得写100分(思路一样),以后可能update..... 84分代码: #include<iostream> #include<cstdio> #include<cstring> using namespace std;…
题面 link 前言 去年把我做自闭的一道题,看了一眼题面,发现只有 t1 有点思路,结果写到一半发现自己读错题了,又只能花时间来重构,结果后面的暴力一点都没写(主要是自己当时不会) 然后,这道题还因为某种原因爆玲了,因此我就成了全机房最菜的人. 题解 这道题题面还是很长的,所以我们简化一下题意. 给你一个 n*m 的矩阵,要求你从每一行选一个数,这一行可以选也可以不选,但最后至少选一个,且选的最多的那一列不能超过选的总数的 \(1 \over 2\) part 1 24 - 32 分 直接爆搜…
题目 题目链接:https://www.luogu.org/problem/P5664 Emiya 是个擅长做菜的高中生,他共掌握 \(n\) 种烹饪方法,且会使用 \(m\) 种主要食材做菜.为了方便叙述,我们对烹饪方法从 \(1 \sim n\) 编号,对主要食材从 \(1 \sim m\) 编号. Emiya 做的每道菜都将使用恰好一种烹饪方法与恰好一种主要食材.更具体地,Emiya 会做 \(a_{i,j}\) 道不同的使用烹饪方法 \(i\) 和主要食材 \(j\) 的菜(\(1 \l…
洛谷AC通道 本题,题目长,但是实际想起来十分简单. 首先,对于树上的每一个后括号,我们很容易知道,他的贡献值等于上一个后括号的贡献值 + 1.(当然,前提是要有人跟他匹配,毕竟题目中要求了,是不同的子串.) 那么,如何记录是否有人跟他匹配??  也很好想...  用一个栈来维护(同时也方便我们记录上一个后括号所在的位置.) 那么,求总贡献值呢??  更好办了.  直接等于他爸爸 + 他自己的呗!! 结束了~~~ #include <bits/stdc++.h> using namespace…
洛谷AC通道! 多年过后,重新来看这道D1T1,20min不到AC,再回忆起当初考场三小时的抓耳挠腮,不禁感慨万千啊!! 发篇题解记录一下. 思路:直接dfs模拟即可(二进制找规律是不可能的, 这辈子也不会去找规律). #include <bits/stdc++.h> using namespace std; #define ll unsigned long long inline ll pow(ll x){ ll a = , temp = ; for(int i = ;i <= x;…
洛谷题目传送门 通过瞪眼法发现,\(a_{i,j}=(i-1)\text{ xor }(j-1)+1\). 二维差分一下,我们只要能求\(\sum\limits_{i=0}^x\sum\limits_{j=0}^y[i\text{ xor }j\le k]\)就好了. 比较套路的数位DP. 从高位往低位做,设\(f[t][0/1][0/1][0/1]\)表示到第\(t\)位,\(i,j,i\text{ xor }j\)已确定的值是否卡到\(x,y,k\)前\(t\)位的上界的方案数和权值和. 每…
次元传送门:洛谷P1169 思路 浙江省选果然不一般 用到一个从来没有听过的算法 悬线法: 所谓悬线法 就是用一条线(长度任意)在矩阵中判断这条线能到达的最左边和最右边及这条线的长度 即可得到这个矩阵的最大值 那么我们定义3个数组 l[i][j]表示(i,j)能到达最左边的坐标 r[i][j]表示(i,j)能到达最右边的坐标 up[i][j]表示(i,j)能向上最大距离 即线的长度 那么状态转移方程得出: l[i][j]=max(l[i][j],l[i-][j]);//满足条件的最大值为左边(因…
dp这一方面的题我都不是很会,所以来练(xue)习(xi),大概把这题弄懂了. 树形dp就是在原本线性上dp改成了在 '树' 这个数据结构上dp. 一般来说,树形dp利用dfs在回溯时进行更新,使用儿子节点对父亲节点进行更新. 树形dp很多题需要在二叉树上进行. 进入正题. 点我看题 这个图是洛谷题面里奇奇怪怪的东西,格式弄好就这样. 题意:有一棵已知根(1)的二叉树,每条边都有一个权值,现在可以保留 q 条边,问在这样的前提下,以 1 为根 的树最多能有多少权值和. 题意可以画个图来解释 这个…
洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复杂 只是存状态有点难想到 思路 因为n最大为12 所以可以想到是状压 因为n<=12 所以可以用邻接矩阵存下图 枚举每个点作为起点开始DFS 注意每次DFS的初始化和赋值问题即可 代码 #include<iostream> #include<cstdio> #include<…
题目链接 位运算+\(DP\)=状压\(DP\)?(雾 \(a\&b>=min(a,b)\)在集合的意义上就是\(a\subseteq b\) 所以对每个数的子集向子集连一条边,然后答案就是这个\(DAG\)的最长链了,跑一遍拓扑排序就行了. 直接连边的复杂度是\(O(n^2)\),显然只能拿\(60'\). 题解里的连边方法我没怎么懂然后因为穷又不能看直播讲解 但是我拿到\(70\)分暴力分后(不要问我为什么有70)看了别人的代码,发现一个很巧妙的方法, 无需建图,\(DP\)的思想,我写…
题面 Bzoj 洛谷 题解 首先考虑从儿子来的贡献: $$ f[u]=\prod_{v \in son[u]}f[v]+(1-f[v])\times(1-dis[i]) $$ 根据容斥原理,就是儿子直接亮的概率减去当儿子不亮且他们之间的路径均不直接亮时的概率 接着考虑从父亲来的贡献,设$p$为:$\frac{g[u]\times f[u]}{f[v]+(1-f[v])\times(1-dis[i])}$ 则:(画画图就可以理解) $$ g[v]=p+(1-p)\times(1-dis[i]) $…
题面 洛谷 题解 \(f[i][j]\)表示有i个人参与游戏,从庄家(即1)数j个人获胜的概率是多少 \(f[1][1] = 1\) 这样就可以不用讨论淘汰了哪些人和顺序 枚举选庄家选那张牌, 枚举下一次的庄家 可以得到这次的庄家 然后转移即可 Code #include<bits/stdc++.h> #define LL long long #define RG register using namespace std; template<class T> inline void…
传送门 思路: 最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价. 那么转移方程就有: \[ dp(i,j)=min\{dp(k,j-1)+(sumT_i+S*j)*(sumC_i-sumC_k)\} \] 为什么有个\(S*j\)呢,因为前面的批次启动会对后面的答案有影响. 但是分析复杂度是\(O(n^3)\)的,肯定不行. 考虑一下为什么需要第二个状态呢?是为了消除后效性,因为后面的状态不知道总共启动了几次. 但我们可以把费用提前计算,一次启…
洛谷题面传送门 经典题一道,下次就称这种"覆盖距离不超过 xxx 的树形 dp"为<侦察守卫模型> 我们考虑树形 \(dp\),设 \(f_{x,j}\) 表示钦定了 \(x\) 子树内的点选/不选的状态,且 \(x\) 子树内必须要被覆盖的点都被覆盖,\(x\) 的 \(1\sim j\) 级祖先都被覆盖了的最小代价,再设 \(g_{x,j}\) 表示 \(x\) 子树内距离 \(x\ge j\) 的必须要被覆盖的点都被覆盖,而 \(x\) 子树内距离 \(x\) \(&…
洛谷题面传送门 又是一道我不会的代码超短的题( 一开始想着用生成函数搞,结果怎么都搞不粗来/ll 首先不妨假设音阶之间存在顺序关系,最终答案除以 \(m!\) 即可. 本题个人认为一个比较亮的地方在于,每个音阶被奏响次数都是偶数这个条件的处理方式.由于是奇偶性,我们可以发现如果我们钦定了其中 \(m-1\) 个片段对应的音阶集合,那么第 \(m\) 个片段中的音阶集合一定已经确定了.我们考虑从这个性质入手.设 \(dp_i\) 表示有多少个包含 \(i\) 个片段且符合要求的音阶集合,那么我们考…
洛谷题面传送门 废了,又不会做/ll orz czx 写的什么神仙题解,根本看不懂(%%%%%%%%% 首先显然一个排列的贡献为其所有置换环的乘积.考虑如何算之. 碰到很多数的 LCM 之积只有两种可能,一是 Min-Max 容斥将 LCM 转化为 GCD,而是枚举质因子及其次数算贡献.但对于此题而言前者不是太可做(可能有复杂度不错(大概 \(n^2d(n)\)?)的解法,不过我没有细想所以也不太清楚),因此考虑后者. 考虑用类似于差分的思想,对于每个质因子 \(p\) 的每个次数 \(k\),…
洛谷题面传送门 神仙级别的树形 dp. u1s1 这种代码很短但巨难理解的题简直是我的梦魇 首先这种题目一看就非常可以 DP 的样子,但直接一维状态的 DP 显然无法表示所有情况.注意到对于这类统计一个路径上权值之和的最值这样的问题,我们可以考虑借鉴 P4383 林克卡特树 的套路,即在 DP 状态中多记录一维 \(j\) 存储当前路径的延伸情况.但是这道题与 林克卡特树 的不同之处在于路径并非是简单路径,即一条路径可以先向上走一段,再向下走一段,接着再向上走一段.因此考虑这样设计 DP 状态:…
链接: P5664 题意: 给出一个 \(n*m\) 的矩阵 \(a\),选 \(k\) 个格子(\(1\leq k\leq n\)),每行最多选一个,每列最多选\(⌊\dfrac k2⌋\) 个,同时每个格子有 \(a_{i,j}\) 种不同选法,问共有多少种不同的选法,对 \(998244353\) 取模.给出 \(n,m\) 和 矩阵 \(a\). 分析: 尝试直接 dp 失败后看了题解.这是道 dp 和容斥的好题. 考虑列的限制,每列最多选\(⌊\dfrac k2⌋\) 个,意味着最多只…
前言 \(csp\)时发现自己做过类似这道题的题目 : P4954 [USACO09Open] Tower of Hay 干草塔 然后回忆了差不多\(15min\)才想出来... 然后就敲了\(88pts\)的部分分.当时的内存是\(950MB\)左右,写一个高精就炸内存了. 题目 2048 年,第三十届 CSP 认证的考场上,作为选手的小明打开了第一题.这个题的样例有 \(n\) 组数据,数据从 \(1 \sim n\) 编号,\(i\) 号数据的规模为 \(a_i\). 小明对该题设计出了一…
题目描述 夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了.小玉家今天收到了一份电费通知单.小玉看到上面写:据闽价电[2006]27号规定,月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行,月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行,月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行;小玉想自己验证一下,电费通知单上应交电费的数目到底是否正确呢.请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少. 输入输出格式 输入格…
Description 传送门 Solution 算法1 32pts 爆搜,复杂度\(O((m+1)^n)\) 算法2 84pts 裸的dp,复杂度\(O(n^3m)\) 首先有一个显然的性质要知道: 最多只有一种主要食材出现在超过一半的主要食材里. 接下来考虑如果只有前两个限制条件的情况,那么答案就是 \[\Pi_{i=1}^{n} (sum_i+1) - 1\] 其中\(sum_i = \sum \limits_{j=1}^m a_{i,j}\),\(+1\)是因为对于每一行只有选一道菜或者…
题目链接:https://www.luogu.org/problemnew/show/P4742 题目大意:给一张有向图, 每个点都有点权,第一次经过该点时,该点的点权有贡献,求这张图上一条路径(终点随意)的贡献最大并且得到该路径上一个最大点权. 思路: 1.值得注意的是,这里并不是求最长路,也就是并不是求最多的点组成的路径,点可以少,但是必须点权和最大. 2.因为需要得到最大点权和以及最大点权,终点又不定,所以我们需要遍历图中每个点,来得到起点到该点的点权和以及路径上的最大点权. 3.先用ta…
luogu题目传送门! 首先,硬求可行方案数并不现实,因为不好求(去年考场就这么挂的,虽然那时候比现在更蒟). 在硬搞可行方案数不行之后,对题目要求的目标进行转换: 可行方案数 = 总方案数 - 不合格方案数. 题目多看几眼,(求最大最小方案数量这种套路),DP无疑. 首先考虑列的限制,发现若有不合法的列,则必然有且只有一列是不合法的:因为不可能有不同的两列数量都超过总数的一半. 于是发现列的合法限制数量可以如此计算:每行选不超过一个的方案数 (总数) -   每行选不超过一个,且某一列选了超过…
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner (System.in); int ele = in.nextInt(); double out; if (ele <= 150) { out = 0.4463*ele; } else if ((150 < ele) && (ele <= 400)) { out =…
description loj 3211 solution 看到题目中要求每种主要食材至多在一半的菜中被使用,容易想到补集转换. 即\(ans=\)总方案数-存在某一种食材在一半以上的菜中被使用的方案. 总方案数很容易求:即对于每一种烹饪方法选至多一道菜的方案为\(s_i+1\),其中\(s_i=\sum_{j=1}^{m} a_{i,j}\). 故总方案数\(=\prod_{i=1}^{n} (s_i+1)-1\),其中-1是因为要去掉一道菜都没有选的方案. 而不合法的方案,我们可以先钦定第\…
64 pts 类似 乌龟棋 的思想,由于 \(64pts\) 的 \(m <= 3\), 非常小. 我们可以设一个 \(dp\),建立 \(m\) 个维度存下每种物品选了几次: \(f[i][A][B][C]\) 表示前 \(i\) 种烹饪方法,第 \(1 / 2/ 3\) 种主要食材各自选了 \(A, B, C\) 道菜的方案数. 状态转移:根据题意,每种烹饪方法最多选一道菜. 不做菜 \(f[i][A][B][C] += f[i - 1][A][B][C]\) 做 \(1\) 道第一种主要食…
思路: 这种题目就考我们首先想到一个性质.这题其实容易想到:超限的菜最多只有一个,再加上这题有容斥那味,就枚举超限的菜然后dp就做完了. 推式子能力还是不行,要看题解. 式子还需要一个优化,就是废除冗余状态将二维化一维. 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=105; const int M=2005; ll mod=998244353,a[N][M],s[N],g[…
题面 题解 不考虑每种食材不超过一半的限制,答案是 减去 1 是去掉一道菜都不做的方案. 显然只可能有一种菜超过一半,于是枚举这种菜,对每个方式做背包即可(记一维状态表示这种菜比别的菜多做了多少份). 设dp[i][j]为前i种方法中这种食材比别人多j份, 则   于是从零开始枚举j就行了 吗 不对,我们可以意识到dp[i][ - | j |]也对答案有影响, 所以我们设dp[i][n]为原先的dp[i][0],n以下的是负数情况 #include<cstdio> #include<io…