动态规划
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 · 274 阅读 · 0 评论 -
Prince and princess
Prince and princess本题看起来像LCS,所以先提LCS的解法最长公共子序列发现最长公共子其实就是两个序列不同元素的LIS,然后就能在O(nlogn)的时间内求出长度——————————————————————————再考虑本题,发现是一样的性质,所以套用上面的做法再考虑本题,发现是一样的性质,所以套用上面的做法再考虑本题,发现是一样的性质,所以套用上面的做法需要注意的是本题输出方式为Case需要注意的是本题输出方式为Case需要注意的是本题输出方式为Case#include&原创 2020-10-16 23:02:44 · 131 阅读 · 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 · 172 阅读 · 0 评论 -
蘑菇
蘑菇仔细思考,发现一个dp就做完了(显然我没想出来)仔细思考,发现一个dp就做完了(显然我没想出来)仔细思考,发现一个dp就做完了(显然我没想出来)好好想一下,树的操作好像就那么几种,想这种求和的怎么看都像树形dp,所以我们就做完了好好想一下,树的操作好像就那么几种,想这种求和的怎么看都像树形dp,所以我们就做完了好好想一下,树的操作好像就那么几种,想这种求和的怎么看都像树形dp,所以我们就做完了f[x][0]表示不包括x联通块的乘积,f[x][1]表示包括x连通块的乘积,随便搞一搞就做完了#inc原创 2020-09-18 22:16:19 · 168 阅读 · 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 · 115 阅读 · 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 · 348 阅读 · 0 评论 -
Keyboard Purchase
Keyboard Purchase洛古地址一看数据范围就知道是状压dp,具体地,dp[S]表示已填的集合为S的最小价值,然后我们加一个数的贡献就是前面的贡献和对后面的贡献一看数据范围就知道是状压dp,具体地,dp[S]表示已填的集合为S的最小价值,然后我们加一个数的贡献就是前面的贡献和对后面的贡献一看数据范围就知道是状压dp,具体地,dp[S]表示已填的集合为S的最小价值,然后我们加一个数的贡...原创 2019-11-15 18:04:55 · 313 阅读 · 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 · 90 阅读 · 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 · 107 阅读 · 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 · 127 阅读 · 0 评论 -
最短路
在我的博客里有一道相似的题,区别就是这题k!能过在我的博客里有一道相似的题,区别就是这题k!能过在我的博客里有一道相似的题,区别就是这题k!能过传送门题目:最短路P.S 这题有个坑点,k可能为0,要特判我们发现k很小,所以直接处理每个关键点到其它点的最短路即可,然后状压或者深搜都能过,1.状压状压即将现在已走过的关键点的集合枚举出来,枚举最后一个点和上一个最后的点,转移即可(时间复杂度是...原创 2019-11-06 18:27:58 · 103 阅读 · 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 · 99 阅读 · 0 评论 -
st表
st 表是倍增的产物st表可以维护区间极值(目前我也就只知道维护区间极值,所以这篇博客也就只讲极值)——————————————————————————————————————st表实际上就是优化状态的一种方式,因为我们把两个长度相等区间合并其实可以知道合并后区间的长度,我们可以通过区间长度代替一个难枚举的量,比如区间端点,这时在优化区间长度,因为电脑用2进制可以O(1)求出,所以如果...原创 2019-09-26 18:22:11 · 147 阅读 · 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 · 187 阅读 · 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 · 440 阅读 · 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 · 345 阅读 · 0 评论 -
质数和——dp
4个质数和备用链接——————————————————————————————————————————————一眼看去,想到dp很明显是经典的背包问题,就直接打了。。。——————————————————————————————————————————————70分做法:其实我是当满分做法做的,但时间复杂度分析错了,时间复杂度应是O(Nk)O(Nk)O(Nk),N表示输入的最大的数...原创 2019-09-10 18:45:00 · 342 阅读 · 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 · 210 阅读 · 0 评论 -
删数
删数刚开始看蒙了由于此题,我得知区间dpdpdp只需要考虑合并的操作条件,即对于本题来说,不需要考虑最开始的操作只能从左或从右删————————————————————————————————————————————直接套用区间dp模板就行了直接套用区间dp模板就行了直接套用区间dp模板就行了区间dp模板#include<bits/stdc++.h>using names...原创 2019-09-11 22:00:09 · 117 阅读 · 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 · 190 阅读 · 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 · 255 阅读 · 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 · 162 阅读 · 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 · 332 阅读 · 0 评论