![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
想出成果的acmer
当你越来越漂亮的时候,自然有人关注你,当你越来越有能力时,自然会有人看得起你,改变自己,你才有自信,梦想会慢慢的实现,要做好你自己,懒惰可以毁掉一个人,勤奋可以激发一个人,不要等到夕阳西下的时候才对自己说如果当初…如果…我就会怎么样,之类的话,都已经晚了,我只想告诉你一句话:要做一个连自己都羡慕的人!
展开
-
dp学习笔记8 数位dp好难QAQ
题目先贴个大佬的模板typedef long long ll;int a[20];ll dp[20][state];//不同题目状态不同ll dfs(int pos,/*state变量*/,bool lead/*前导零*/,bool limit/*数位上界变量*/)//不是每个题都要判断前导零{ //递归边界,既然是按位枚举,最低位是0,那么pos==-1说明这个数我枚举完了 if(pos==-1) return 1;/*这里一般返回1,表示你枚举的这个数是合法的,那么这里就需要原创 2022-04-30 15:18:42 · 126 阅读 · 0 评论 -
dp学习笔记7 换根dp不会捏
题目题意: 有一棵 n 个点的树,每条边有一流量限制。令某一个点为根节点,向根节点灌水,最终从叶子节点流出的水量和为这一个点的最大流量,请求出每个点的最大流量。思路: f[i]:表示以i为根的子树最多能承载的流量(当以1为根时).f[i] = Sigma min(f[son] + a[i][son]),流量受到两个方面的限制,一是儿子这棵子树能承载的最大流量,二是这条边的最大流量。一遍dfs即可求出f[1].设置v[i]:表示换根后以i为根的子树的流量改变量.接下来我们考虑换根的影响,即把根从原创 2022-04-28 15:05:19 · 109 阅读 · 0 评论 -
dp学习笔记 6 没有上司的舞会2 (树形dp)
题目题意: n个点的有根树,每个点有权值ai。选了父节点就不能选择子节点,并且最多选择m个节点。思路: f[i][j][0/1]:以i为根,至多选择j个节点,0:选,1:不选。参考上一题的什么背包,枚举树根i选择的节点个数j,之后枚举子树选择的节点0,1…j。如果不选树根i,那么子树都可以选;如果选树根i,只能不选子树的根节点。 这里有点费解的是不知道为啥j要从大到小枚举,wls的解释是因为该题的模型和上一题背包一样,所以照搬从大到小。 以后最后赋值的循环来看,如果从小到大会导致一个点会选择多次原创 2022-04-25 21:08:45 · 355 阅读 · 0 评论 -
dp学习笔记 5 序列删除(区间dp)
题目题意: 给定n个数,把除a1和an的其余数全部删除。删除第i个数的代价为a[i]*a[l]*a[r]. a[l]和a[r]是a[i]左右尚未被删除的数。思路: 区间dp,一直在想先删除哪边另一边就会变,绕不明白。只能说对区间dp的理解不是很到位。对于区间[i,j]枚举中间点k,k即区间[i,j]中最后删除的数,他的代价自然容易计算。f[i][j] = min(f[i][j],f[i][k-1]+f[k+1][j]+a[k]a[i-1]a[j+1])!这里要注意,直接把数组赋值为INF会寄,因为原创 2022-04-25 19:31:13 · 570 阅读 · 0 评论 -
dp学习笔记 4 多重背包(单调队列优化)
题目题意: 多重背包.思路: 单调队列优化,O(n*m). 原来我们常用的写法是对于某个体积j往前找,枚举用多少个物品i, j-vi,j-2vi. 我们也可以直接往后推,因为对于每个体积j,j%v < v, 枚举0 - v-1为初始体积再枚举物品i的使用次数,也可以推导出所有可放入物品i的相应状态。这个有什么用呢,对于每个状态 j + xv 可以由于 j + (x-1)v+w, j + (x-2)v+2w,j+(x-k)v+kw 等等推出.f[j+xv] = max(f[j+kv]原创 2022-04-25 11:06:30 · 148 阅读 · 0 评论 -
dp学习笔记 3 单调队列
题目题意: 给定n个人,每个人存在的时间为i-a[i],攻击力为b[i],输出每一天最高的攻击力。 (a[i] <= a[i+1])思路: 单调队列。因为每个人保证先出现的先消失或同时消失,所以当前边某个人的攻击力小于等于当前这个人第i天的攻击力,那他是不可能以最大值出现的,直接删除即可。所以我们维护一个队列,他会保证是单调递减的,最大值即当前队列的队首。(因为前边<=的会一直被弹栈)另外,每天要把队首即将消失的人弹出队列。时间复杂度: O(n)代码:#include<ios原创 2022-04-25 10:01:36 · 103 阅读 · 0 评论 -
dp学习笔记 分组背包
题目题意: 模板题。思路: 每个组最多选一个,按组存起来,按01背包方式写。时间复杂度: O(n*m)代码:#include<iostream>#include<cstdio>#include<algorithm>#include<complex>#include<cstring>#include<cmath>#include<vector>#include<map>#include&l原创 2022-04-24 22:01:38 · 142 阅读 · 0 评论 -
dp学习 多重背包
题目题意: 模板题,多重背包。思路:1.朴素写法,cnt[i]个物品可以看作cnt[i]个一模一样的物品,当作01背包。O(nmcnt)2.二进制优化,原理是[0,n]之间的数可以用2的幂次和余项凑出,有点二进制的思想在里边。时间复杂度: O(nmlog(cnt))代码:#include<bits/stdc++.h>using namespace std;const int N = 2002;int n,m,k,T;int v[N];int w[N];int cn原创 2022-04-23 22:36:14 · 299 阅读 · 0 评论 -
分治FFT学习笔记
FFT. 对于n次多项式和m次多项式相乘需要n*m的时间tips: 对于n次多项式,只需要任意 n+1个多项式上的点即可唯一确定。 如果多项式用点表示法计算,可以用n+m的时间完成计算。 通过分治FFT可以花nlogn的时间由系数表示法变为点表示法,n+m的时间计算完成后,再花nlogn由点表示法变为系数表示法. 既然这n+1个点可以任意选,我们可以选择一些具有良好性质的点。比如选择n个复数根。可以发现对于某一个x,可以由多项式的偶数项构成的多项式和奇数项构成的多项式的两个数求得,所以可以原创 2022-04-01 16:56:31 · 198 阅读 · 0 评论