动态规划
文章平均质量分 54
Dlkoiw
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
跑路
跑路 #include<bits/stdc++.h> using namespace std; const int N=110; int n,head[N],cnt=0,m; struct edge{ int link,v; }q[N*N]; void put(int u,int v){ q[++cnt].v=v; q[cnt].link=head[u]; head[u]=cnt; } bool dp[N][N][32],f[N][N]; bool vis[N]; int dis[N]原创 2020-11-24 22:25:50 · 409 阅读 · 0 评论 -
Prince and princess
Prince and princess 本题看起来像LCS,所以先提LCS的解法 最长公共子序列 发现最长公共子其实就是两个序列不同元素的LIS,然后就能在O(nlogn)的时间内求出长度 —————————————————————————— 再考虑本题,发现是一样的性质,所以套用上面的做法再考虑本题,发现是一样的性质,所以套用上面的做法再考虑本题,发现是一样的性质,所以套用上面的做法 需要注意的是本题输出方式为Case需要注意的是本题输出方式为Case需要注意的是本题输出方式为Case #include&原创 2020-10-16 23:02:44 · 218 阅读 · 0 评论 -
luck
luck 没什么好说的,就是一道裸题 但需要注意的是时间是O(n*k),1e7级别,这个级别是会卡常的,所以要进行优化 这是90分代码 #include<bits/stdc++.h> using namespace std; typedef long long ll; ll ans=0; int mod=1e9+7; const int N=5e4+5; int y,z; int dp[N][505]; ll dfs(int dep,int state,int p){ int tmp=y-s原创 2020-10-08 15:09:31 · 253 阅读 · 0 评论 -
蘑菇
蘑菇 仔细思考,发现一个dp就做完了(显然我没想出来)仔细思考,发现一个dp就做完了(显然我没想出来)仔细思考,发现一个dp就做完了(显然我没想出来) 好好想一下,树的操作好像就那么几种,想这种求和的怎么看都像树形dp,所以我们就做完了好好想一下,树的操作好像就那么几种,想这种求和的怎么看都像树形dp,所以我们就做完了好好想一下,树的操作好像就那么几种,想这种求和的怎么看都像树形dp,所以我们就做完了 f[x][0]表示不包括x联通块的乘积,f[x][1]表示包括x连通块的乘积,随便搞一搞就做完了 #inc原创 2020-09-18 22:16:19 · 242 阅读 · 0 评论 -
餐馆
餐馆 既然是棵树,肯定就要dp了既然是棵树,肯定就要dp了既然是棵树,肯定就要dp了 dp[s][j],表示在以s为根的子树内走j步的最大价值,但我们发现这样没法统计答案dp[s][j],表示在以s为根的子树内走j步的最大价值,但我们发现这样没法统计答案dp[s][j],表示在以s为根的子树内走j步的最大价值,但我们发现这样没法统计答案 定义dp[s][j][0/1]表示在以s为根的子树内走j步,最终回或不会s的最大价值,然后就可以转移了定义dp[s][j][0/1]表示在以s为根的子树内走j步,最终回或不原创 2020-08-03 02:33:19 · 175 阅读 · 0 评论 -
JEDAN
JEDAN 我们发现,[l,r]相等,修改(l,r) 则一定满足a数组可以达到当且仅当a中相邻两数的差不超过1,感性理解 则建立dp, dp[i][j] 表示a[i]=j 然后滚动数组一下 #include<bits/stdc++.h> using namespace std; const int N=1e4+5; int mod=1e9+7,dp[2][N],a[N],n; int...原创 2019-12-06 19:08:43 · 419 阅读 · 0 评论 -
Keyboard Purchase
Keyboard Purchase 洛古地址 一看数据范围就知道是状压dp,具体地,dp[S]表示已填的集合为S的最小价值,然后我们加一个数的贡献就是前面的贡献和对后面的贡献一看数据范围就知道是状压dp,具体地,dp[S]表示已填的集合为S的最小价值,然后我们加一个数的贡献就是前面的贡献和对后面的贡献一看数据范围就知道是状压dp,具体地,dp[S]表示已填的集合为S的最小价值,然后我们加一个数的贡...原创 2019-11-15 18:04:55 · 438 阅读 · 0 评论 -
石子合并
石子合并 本题是区间dp模板题,但不知道为什么这么一道模板题我竟然没打, 注意本题是环形,所以要开2倍空间才能过。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll INF=1234567890; const int N=110; ll dp[N*2][N*2][2]; ll val...原创 2019-11-13 20:28:24 · 143 阅读 · 0 评论 -
滑动窗口
滑动窗口 本题是个模板的单调队列题 单调队列的算法核心就是将“活得久的方案”存下来,其它的移除队列,同时还要每次结束都更新答案(如果满足更新答案的条件),防止有些状态没有被更新到 #include<bits/stdc++.h> using namespace std; const int N=1e6+5; int n,q[N],val[N],k; int main(){ scanf...原创 2019-11-12 16:44:58 · 165 阅读 · 0 评论 -
方格取数
方格取数 考虑两个人走dp[i][j][k][z]表示1在(x,y),2在(k,z)的最大值dp[i][j][k][z]表示 1在(x,y),2在(k,z)的最大值dp[i][j][k][z]表示1在(x,y),2在(k,z)的最大值 #include<bits/stdc++.h> using namespace std; typedef long long ll; const in...原创 2019-11-07 19:53:36 · 200 阅读 · 0 评论 -
最短路
在我的博客里有一道相似的题,区别就是这题k!能过在我的博客里有一道相似的题,区别就是这题k!能过在我的博客里有一道相似的题,区别就是这题k!能过 传送门 题目:最短路 P.S 这题有个坑点,k可能为0,要特判 我们发现k很小,所以直接处理每个关键点到其它点的最短路即可,然后状压或者深搜都能过, 1.状压状压即将现在已走过的关键点的集合枚举出来,枚举最后一个点和上一个最后的点,转移即可(时间复杂度是...原创 2019-11-06 18:27:58 · 164 阅读 · 0 评论 -
迷宫maze
maze 我本来以为k!k!k!能过的 仔细观察,发现k很小,这时想到状压dp,具体地,用集合S表示已经解救的伙伴的集合,dp[S][i]表示当前集合为S,最后的位置为i的最小值仔细观察,发现k很小,这时想到状压dp,具体地,用集合S表示已经解救的伙伴的集合,dp[S][i]表示当前集合为S,最后的位置为i的最小值仔细观察,发现k很小,这时想到状压dp,具体地,用集合S表示已经解救的伙伴的集合,d...原创 2019-10-06 11:33:26 · 160 阅读 · 0 评论 -
st表
st 表是倍增的产物 st表可以维护区间极值(目前我也就只知道维护区间极值,所以这篇博客也就只讲极值) —————————————————————————————————————— st表实际上就是优化状态的一种方式, 因为我们把两个长度相等区间合并其实可以知道合并后区间的长度, 我们可以通过区间长度代替一个难枚举的量,比如区间端点, 这时在优化区间长度,因为电脑用2进制可以O(1)求出,所以如果...原创 2019-09-26 18:22:11 · 210 阅读 · 0 评论 -
字符串——dp
Reverse and Compare 这道题看起来像回文串的题,但却不是。。。。 我们考虑 si和sjs_i和s_jsi和sj换后本质不同, 则si与sjs_i与s_jsi与sj一定不是回文串,但为了不重复,我们找到第一个不同的交换,后面如果出现相同的就是同种方案 dp[i]表示前i个中字符串的方案数dp[i]表示前i个中字符串的方案数dp[i]表示前i个中字符串的方案数 我们扫描前面有...原创 2019-07-25 18:10:03 · 265 阅读 · 0 评论 -
动态规划——数位dp
数位dp 数位dp实质是记忆化搜索 比如给出一个区间[l,r] 要你求[l,r]中有多少个数是3的倍数 for(int i=l;i<=r;i++){ if(i%3==0) ans++ } 但是这样时间fuza原创 2019-07-23 10:58:41 · 969 阅读 · 0 评论 -
数位dp例题——找数
找数 题面 给你两个数L,R,请求出在区间[L,R]中,有多少个数符合十进制下任意相邻K位数字的值两两互不相同,数不足K位则取全部数位。 一看这道题我们就知道是数位dp,但有k位,果断跳过, 赛后:原来k这么小,2<=k<=5,… 警示:一定要看数据范围 显然我们对于k的情况暴力枚举即可 if(K==2){ if(i==d) continue; re...原创 2019-07-23 11:10:37 · 441 阅读 · 0 评论 -
质数和——dp
4个质数和 备用链接 —————————————————————————————————————————————— 一眼看去,想到dp 很明显是经典的背包问题,就直接打了。。。 —————————————————————————————————————————————— 70分做法: 其实我是当满分做法做的,但时间复杂度分析错了, 时间复杂度应是O(Nk)O(Nk)O(Nk),N表示输入的最大的数...原创 2019-09-10 18:45:00 · 443 阅读 · 0 评论 -
dp/分治
区配最大异或 这题看着很蒙,暴力都不会打。。。 —————————————————————————————————————————————— AC代码 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=(1<<16); int in[N],n,m; ll mod=1...原创 2019-09-11 18:35:03 · 283 阅读 · 0 评论 -
删数
删数 刚开始看蒙了 由于此题,我得知区间dpdpdp只需要考虑合并的操作条件,即对于本题来说,不需要考虑最开始的操作只能从左或从右删 ———————————————————————————————————————————— 直接套用区间dp模板就行了直接套用区间dp模板就行了直接套用区间dp模板就行了 区间dp模板 #include<bits/stdc++.h> using names...原创 2019-09-11 22:00:09 · 166 阅读 · 0 评论 -
dp——gcd problem
**gcd promblem 如果没有NTF讲dp,我真想不到怎么dp,没想到dp可以这么用; —————————————————————————————————————————————— 先把需要的状态表示出来,我们一定需要gcd,所以dp中一定要有gcd,但这样会是 dp[i][j]表示前i个数,gcd为j的最大值dp[i][j]表示前i个数,gcd为j的最大值dp[i][j]表示前i个数,g...原创 2019-09-19 22:24:06 · 269 阅读 · 0 评论 -
树形dp——DOVE爱旅游
DOVE爱旅游 本题一看就是树形dp,直接写模板就行了 #include<bits/stdc++.h> using namespace std; const int N=1000010; int cnt=0,n,a[N],dp[N][2]; struct egde{int link,v;}q[N*2]; int head[N]; void put(int x,int y){q[++c...原创 2019-09-20 21:28:40 · 319 阅读 · 0 评论 -
打字机——线性递推
打字机 本题看起来很不好做,但仔细画画图找找规律之后还是能找出规律的 —————————————————————————————————————————————— 现在已知以s[i]s[i]s[i]结尾的答案sum[i]sum[i]sum[i]和总答案, 这时候一个准备加进答案的doth[j]doth[j]doth[j] 那么我们发现,总答案的两倍减去sum[i]sum[i]sum[i] 证明:原...原创 2019-09-20 22:13:05 · 238 阅读 · 0 评论 -
dp——拆分
这道题太神奇了,这么久我才理解了一点。。。。 接下来就是照打了 原题链接 这种题目考虑背包, dp[i][j]dp[i][j]dp[i][j]表示枚举到第i个数,乘积为j的方案总数, 而易推知dp[i]只和dp[i−1]dp[i]只和dp[i-1]dp[i]只和dp[i−1]有关,用经典的背包降维, 即dp[j]=max(dp[j],dp[j/k]+1),kdp[j]=max(dp[j],dp[j...原创 2019-07-23 17:59:04 · 419 阅读 · 0 评论
分享